質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

3456閲覧

phpで指定した文字より前の文字を取得したいがうまくできない

hatsu

総合スコア1809

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/09/23 07:58

編集2017/09/23 08:25

「 株式会社夢真ホールディングス(JASDAQ上場)★土日休み/残業少なめ/面接1回/最短5日で内定可能/◇総合職(管理教育/事務等)※全国募集/土日祝休/月給30万円以上(1005684) の求人情報 」

「 輝建設株式会社 ★65年の歴史を有する建設会社!公共工事を多数手がけています★/建築総合職【建築施工管理/土木施工管理】(1010065) の求人情報 」

などの求人のtitleから会社名を取得したいです。
ほぼ全て「会社名」のあとに「【,[,(, , ,《,/」
などが続き、詳細を乗せた文章が上のように書かれています。
そこで上記の括弧やスペースなどが出てくる前の文字を取得しようと考えて作ったのが(非常に冗長で恐縮ですが)以下のようなコードです。
しかし表示させると
イメージ説明
のように「ホールディングス」の「ー」が出てくるとうまく行かないです。
ぜひ、解決方法がわかる方、心当たりある方些細なことでもご教授して頂けますと幸いです。
何卒よろしくお願いします。

php

1 2$namikakko = '【'; 3 $semikakko = '['; 4 $marukakko = '('; 5 $hanspace = ' '; 6 $zenspace = ' '; 7 $sugokakko = '《'; 8 $slash = '/'; 9 10 $company_name = "株式会社夢真ホールディングス(JASDAQ上場)★土日休み/残業少なめ/面接1回/最短5日で内定可能/◇総合職(管理教育/事務等)※全国募集/土日祝休/月給30万円以上(1005684) の求人情報"; 11 12//検索対象の文字列 13 $namikakko = mb_convert_encoding($namikakko,"sjis","utf-8"); 14 $semikakko = mb_convert_encoding($semikakko,"sjis","utf-8"); 15 $marukakko = mb_convert_encoding($marukakko,"sjis","utf-8"); 16 $hanspace = mb_convert_encoding($hanspace,"sjis","utf-8"); 17 $zenspace = mb_convert_encoding($zenspace,"sjis","utf-8"); 18 $sugokakko = mb_convert_encoding($sugokakko,"sjis","utf-8"); 19 $slashkakko = mb_convert_encoding($slashkakko,"sjis","utf-8"); 20 21//検索対象の文字列が何番目にあるか取得 22 $namikakko_length = strpos($company_name,$namikakko); 23 $semikakko_length = strpos($company_name,$semikakko); 24 $marukakko_length = strpos($company_name,$marukakko); 25 $hanspace_length = strpos($company_name,$hanspace); 26 $zenspace_length = strpos($company_name,$zenspace); 27 $sugokakko_length = strpos($company_name,$sugokakko); 28 $slashkakko_length = strpos($company_name,$slashkakko); 29 30//検索対象の文字列が何番目にあるかの数値を全て$langth_arrayの配列に入れる 31 $length_array = array();; 32 if($namikakko_length != 0 or $namikakko_length !== false){ 33 $length_array[] = $namikakko_length; 34 } 35 if($semikakko_length != 0 or $semikakko_length !== false){ 36 $length_array[] = $semikakko_length; 37 } 38 if($marukakko_length != 0 or $marukakko_length !== false){ 39 $length_array[] = $marukakko_length; 40 } 41 if($hanspace_length != 0 or $hanspace_length !== false){ 42 $length_array[] = $hanspace_length; 43 } 44 if($zenspace_length != 0 or $zenspace_length !== false){ 45 $length_array[] = $zenspace_length; 46 } 47 if($sugokakko_length != 0 or $sugokakko_length !== false){ 48 $length_array[] = $sugokakko_length; 49 } 50 if($slashkakko_length != 0 or $slashkakko_length !== false){ 51 $length_array[] = $slashkakko_length; 52 } 53 54//一番初めにでた検索対象文字列が何文字目で出たか取得 55 $length = min($length_array); 56 57//求人タイトルの1文字目から一番初めにでた検索対象文字列までの文字列を取得 58 $company_name = substr($company_name, 0, $length);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

PHP

1$company_name = mb_convert_encoding($company_name,"sjis","utf-8");

PHP

1$company_name = mb_convert_encoding($company_name,"SJIS-win","utf-8");

に変えたらいけたりしないでしょうか?
マイナスが文字化け

投稿2017/09/23 09:42

tanat

総合スコア18709

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

作成されているプログラムがSHIFT_JISのようですが、5Cの問題があったり、PHPのバージョンによる不具合もあるので、正規表現を使った検索等であれば、UTF-8をベースのコードにされた方が無難です。

投稿2017/09/23 09:38

n884

総合スコア100

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

文字コード変換をしている等、もとの文字コードがどのようになっているか不明ですが、下記のように取得できないでしょうか。
正規表現を使用しています。

PHP

1<?php 2 3$company_name = "株式会社夢真ホールディングス(JASDAQ上場)★土日休み/残業少なめ/面接1回/最短5日で内定可能/◇総合職(管理教育/事務等)※全国募集/土日祝休/月給30万円以上(1005684) の求人情報"; 4 5$ret = preg_match('/^.*?(?=(|\[|(| | |《|/)/', $company_name, $matches); 6 7if ($ret == 1) { 8 $company_name = $matches[0]; 9 print "${company_name}\n"; 10} else { 11 print "No match.\n"; 12}

投稿2017/09/23 08:45

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsu

2017/09/23 09:18

suyama様 回答ありがとうございます。 $company_nameを一度エンコードしないと文字化けがしてしまったため $company_name = "株式会社夢真ホールディングス(JASDAQ上場)★土日休み/残業少なめ/面接1回/最短5日で内定可能/◇総合職(管理教育/事務等)※全国募集/土日祝休/月給30万円以上(1005684) の求人情報"; $company_name = mb_convert_encoding($company_name,"sjis","utf-8"); $ret = preg_match('/^.*?(?=(|\[|(| | |《|/)/', $company_name, $matches); if ($ret == 1) { $company_name = $matches[0]; print "${company_name}\n"; } else { print "No match.\n"; } とし、実行しました。 しかし、結果は変わらず「株式会社夢真ホ�」となってしまいます。。。 文字コードを変えなければならないあたりに原因があるのでしょうか...?
退会済みユーザー

退会済みユーザー

2017/09/23 09:38

再現しました。ソースコードがShift_JISで保存されているようです。 その場合、PHPの関数が"["と誤判定を起こしているようです。 ファイルをUTF-8で保存して実行すればよいかと思いますが、できない理由はあるでしょうか。
退会済みユーザー

退会済みユーザー

2017/09/23 09:46

質問に記載頂いているコードではUTF-8で記載されているようです。 $company_name側がShift_JISで取得となっているということですね。 もともとのコードでも、$company_name側をUTF-8に変換すれば期待の動作になるものと思います。
退会済みユーザー

退会済みユーザー

2017/09/23 10:00

Shift-jisにはダメ文字(長音符はダメ文字に含まれる)というものがあるため、正規表現などで抽出する際にはUTF-8に変換してから行ったほうがいいです。 今回の場合はおそらく元の文字列はUTF-8で取得できているので、正規表現で抽出後に、文字化け回避のためのエンコーディングを行いましょう。
hatsu

2017/09/23 11:32

suyama様、TKatayama様 ご協力ありがとうございます。 もともと別のところでの表示で以下のコードを一番初めに書いていたためそれを消しutf-8にしました。 <?php header("Content-type: text/html; charset=Shift_JIS"); ?> $company_name = "株式会社夢真ホールディングス(JASDAQ上場)★土日休み/残業少なめ/面接1回/最短5日で内定可能/◇総合職(管理教育/事務等)※全国募集/土日祝休/月給30万円以上(1005684) の求人情報"; と直接設定した時には、エンコーディングなしでうまくいったのですが、スクレイピングしたた値を$company_nameに入れた際には文字化けが起こりました。そこで$company_nameをpreg_matchする直前にsjisからutf-8に変換したところ全てうまくいきました。 ご協力感謝いたします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問