• ベストアンサー

文字列から指定した文字を取り出す

たとえば $test = "■-●-△-★-■■-■-■"; という文字列があったとして、 -で文字を区切り、■■は含めず■のみを取り出したい場合、 どのようにしたらいいのでしょうか。 $split = split("-",$test); $count_split = count($split); for($i=0; $i < $count_split; $i++){ if($split[$i] == "■"){ echo "{$split[$i]}"; } } としていますが、もっとスマートにできないのでしょうか。 よろしくお願いいたします。

  • PHP
  • 回答数2
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

正規表現で否定先読みと否定戻り読みをするとか? <? $test = "■-●-△-★-■■-■-■"; preg_match_all("/(?<!■)■(?!■)/",$test,$match); print implode($match[0]); ?>

hukazuo
質問者

お礼

ありがとうございました。 無事できました。

その他の回答 (1)

回答No.2

僕も前回答された方の正規表現利用がスマートだと思います。 その上でもし正規表現なしだとしたらですが、for()よりforeach()の方が微妙にスマートにはなるかと思い書いてみました。 $split = split("-",$test); foreach($split as $val){ if($val == "■"){ echo $val; } } ただし、$splitが要素を持っていることが前提で、無い場合にwarningが出ますからforeach前に検証すべきだったりもあり、やはり正規表現利用が一番スマートでしょうね。

hukazuo
質問者

お礼

ありがとうございました。 正規表現なしでもできるのですね。 今後活用できそうです。

関連するQ&A

  • 文字列の取り出し方

    今、Visual Basic 2008を使用しています。 textbox2とtextbox3があり、textbox2に複数行にまたがる文字列があります。 この文字列の中で、listbox1の中にある項目の文字列が入ってる場合はカンマ区切りで文字列の後ろにつなげたいのですが、うまくいきません。 具体的には あいうえお あかさたな いろはにほ というtextbox2の内容について、listbox1内に あ い という2つの項目があった場合、 あいうえお,あ,い あかさたな,あ いろはにほ,い という結果をtextbox3に書き出すという内容です。 Dim addtag As String = "" Dim i As Integer For Each part As String In TextBox2.Text.Split(vbCrLf) If part <> "" Then For i = ListBox1.Items.Count - 1 To 0 Step -1 If part.Contains(ListBox1.Items(i)) = True Then addtag = addtag & "," & ListBox1.Items(i) End If Next part = part & addtag TextBox3.Text = TextBox3.Text & part & ControlChars.NewLine part = "" addtag = "" End If Next というプログラムを組んでいますが、どこが間違っているのかわからず、煮詰まってしまいました。 プログラムは初心者で、根本から違っていたら恥ずかしい限りですが、どうかよろしくお願いします。

  • 文字列の検索について

    こんにちわ。文字列の検索について質問があります。 ↓のコードは、 「$str という文字列の中に"<!>" という文字列が含まれていたら、その都度その位置を 知らせる」と意図したものです。 $str の中に "<!>" が3つ含まれていたら、3回それらの位置を知らせるはずです。 しかし、実際は、最後の $iの位置だけ出力されます。 どこに問題があるのでしょうか? よろしくお願いいたします。 -------コード(ココカラ)------- for ($i=1; $i<length; $i++) { $strsub=substr($str, $i, $i+2); if ($strsub == "<!>") { echo $i; echo "\r\n"; } } -------ココマデ-------

    • ベストアンサー
    • PHP
  • 2つの文字列を比較する方法

    二つの文字列を比較して違う箇所を発見したとき 何らかの処理を行うようなプログラムを書きたいのですが、 私の想像力が貧困な為そのアルゴリズムを考え付く事ができません どなたか知恵を貸していただけないでしょうか? 具体的には以下のようなことをやっています。 私は現在,変数で var exStr1="||||||||||+|1|2|3|4|5|6|7|8|9|+||||||||||"; var exStr2="||2||||||||+|1||3|4|5|6|7|8|9|+||||||||||"; と宣言しているとき私は exStr1とexStr2では文字列の何処が違うか知る処理を知りたいのです。 とりあえず今私は変数X1とX2に X1 = exStr1.split("+"); X2 = exStr2.split("+"); として「+」を区切り文字にして配列に入れてみて 更にソレを「|」で区切りなおしてみてます。 for(i=0;i<10;i++){   Y1 = X1[i].split("|");   Y2 = X2[i].split("|"); } そこで違う場所を探すための処理として私は以下のように書いて見ました。 しかし現在全然動いてくれません。 for(i=0;i<10;i++){   if(X1[i] != X2[i]){     for(j=0;j<4;j++){       if(Y2[j] != Y1[j] && Y2[i]==""){         //ここで何らかの処理をしたい。しかし今はif文の条件がおかしいのか、この行の処理に入らない。       }     }   } } う~。なんか質問の域を越えてるとも思いますし、 それに我ながら質問の意味がわかりづらいとは思うのですが お願いします。なんらかのヒントのようなものでも頂けたら幸いです。

  • 配列の値を集めた1つの文字列として取得するには

    Array ( [0] => a [1] => あ [2] => 123 [3] => 55 ) この配列を "a","あ","123","55" といった1つの文字列として取得したいです。 <?php $list = array("a","あ","123",55); $r = ""; for($i=0; $i<count($list); $i++){ $r .= ',"'.$list[$i].'"'; } $r = substr($r,1); echo $r; ?> このような形でできましたが、もっと良い方法はありますか? そして上の方法で良い場合は、下の1~4のどれが一番適切ですか? [1] for($i=0; $i<count($list); $i++){ $r .= ",\"".$list[$i]."\""; } [2] for($i=0; $i<count($list); $i++){ $r .= ',"'.$list[$i].'"'; } [3] foreach($list as $key => $val){ $r .= ",\"".$val."\""; } [4] foreach($list as $key => $val){ $r .= ',"'.$list[$i].'"'; }

    • 締切済み
    • PHP
  • 【VBA】指定の範囲から特定の文字列を探す

    こちらの識者の方々にはいつもお世話になっています。 VBAの質問です。 環境は下記になります。 OS=windowsXP SP3 Office=Excel2003(11.8347.8403) SP3 A列に"aa"の文字列が含まれる場合、その行を非表示にして、印刷する。 "aa"の文字列が無かった場合は印刷しない。 というコードを書きたいのですが、分からず困っています。 Dim EndRow As Long Dim i As Long EndRow = cells(Rows.Count, 1).End(xlup).Row  For i = 1 To EndRow   If Cells(i, 1) = "aa" Then Rows(i).EntireRow.Hidden = 1  Next で一行ずつ調べていって非表示にすることはできましたが、その後がわかりません。 上記のような場合、どのようなコードが適していますでしょうか。 なお、上記For Next文は必ず使いたいというわけではありません。 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

  • エクセルVBAの文字列操作について2

    エクセルVBAの文字列操作について2 以前、こちらでご教授いただいた以下のような文字列操作方法があります。 この方法ですと例えば[1-3]から3をひいた際に"1-2"と表示されますが 今回は連続する数字が2つの場合は1,2と表示させ3つ以上の場合は-でつないで表示させたいと思います。 一週間ほど考えたのですが解決できませんでした。 どなたかご協力お願いいたします。 質問内容 例えば、[1-10,15-20,22-38]と入っているセルがあるとします。 このセルに数を足したり引いたりしたいのです。 例えば、このセルから”5”を引いて[1-4,6-10,15-20,22-38]と表示したり、 "21"を足して[1-10,15-38]と表示したい。 いただいたご回答  A1 セル に「1-10,12,15-20,22-38」と入力されているとして、別のセルに =NUMORDER(A1,-5) と入力すると「1-4,6-10,12,15-20,22-38」と表示し =NUMORDER(A1,21) と入力すると「1-10,12,15-38」と表示します。  1つ目の引数には「セル番地」または「文字列」を、2つ目の引数には「1 ~ 99 までの整数」をお入れください。 Function NUMORDER(myStr As Variant, num As Integer) As String  Dim i As Long  Dim j As Double  Dim myNum As Variant   '文字列中の スペース を削除  myStr = Replace(myStr, " ", "")   '文字列の前後に「0」・「100」を挿入  Select Case Left(myStr, 2)   Case "1,", "1-"    myStr = myStr & ",100"   Case Else    myStr = "0," & myStr & ",100"  End Select   '文字列を カンマ で分割し、ハイフン の区間の数字を補完する  myStr = Split(myStr, ",")  For i = 0 To UBound(myStr)   If InStr(myStr(i), "-") > 0 Then    myNum = Split(myStr(i), "-")    myStr(i) = ""    For j = myNum(0) To myNum(1)     myStr(i) = myStr(i) & " " & j    Next    myStr(i) = Trim(myStr(i))   End If  Next   '欠番に「●」を入れ、「数を足したり引いたり」する  myStr = Split(Join(myStr))  For i = 0 To UBound(myStr) - 1   myStr(i) = myStr(i) & Application.WorksheetFunction.Rept(" ●", myStr(i + 1) - myStr(i) - 1)  Next  myStr = Split(Join(myStr))  If num > 0 Then   myStr(num - myStr(0)) = num  Else   myStr(-num - myStr(0)) = "●"  End If   '前後に挿入した「0」・「100」を削除  myStr = Replace(Join(myStr), " 100", "")  If Left(myStr, 2) = "0 " Then myStr = Right(myStr, Len(myStr) - 2)   '連続数字を ハイフン で繋ぐ  myStr = Split(myStr, "●")  For i = 0 To UBound(myStr)   If myStr(i) <> " " Then   myNum = Split(Trim(myStr(i)))    If UBound(myNum) > 0 Then     myStr(i) = myNum(0) & "-" & myNum(UBound(myNum))    End If   End If  Next   'カンマ で文字列に分割する  myStr = Application.Trim(Join(myStr))  NUMORDER = Replace(myStr, " ", ",") End Function

  • 文字列変換について

    質問させてください。 携帯のサイトで各種(Vodafone, au)携帯電話からBBSに感想を入力する画面を作成しました。 入力される文字列は文字、数字、絵文字があります。 入力されたデータはPostgreSQLのDBに格納しています。 その格納された文字列(絵文字含む)を各種携帯で 表示してみたところ、お互いの絵文字が問題に なったため、変換処理を追加しました。 ======================================== $msg = "********";(DBから取得した文字列(絵文字含む)) $emoji = file(emoji_file.txt); for($r=0;$r<count($emoji);$r++){ $string = chop($emoji[$r]); $emoji_data = split("===", $string); if(strstr($msg, $emoji_data[0])){ echo("HIT"); $msg = eregi_replace($emoji_data[0], $emoji_data[1], $msg); } } echo($msg); ====================================== emoji_file.txt $Fr===1 $G-===281 $G.===287 ====================================== 上記のプログラムで、 DBから取得した文字列内にemoji_file.txt にある絵文字データがあれば数値に変換したいと 考えていますが、"HIT"が表示されるにも かかわらず変換されずに表示されます。 これは、"$G."などVodafoneの絵文字が 普通の文字列と違うからでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • シェルスクリプト文字列の処理について

    はじめましてよろしくお願いします。 質問サイトもシェルも初心者なので至らない点がございましたら ご容赦の程よろしくお願いします。 下記シェルスクリプトを実行すると下記エラーが発生します。 「test2」変数に空白無しで「abc」と入力するとエラーは発生しません。 変数test2の値(a bc)を変更せずにエラーが発生しない方法はないでしょうか? 手段でもかまいませんので教えてください。 ========================= testsh110207.sh ====================================== #!/bin/sh test1="abc" test2="a bc" if [ ${test1} = ${test2} ] then echo "=:文字列1と文字列2が等しい場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しい" fi if [ ${test1} != ${test2} ] then echo "!=:数値1と数値2が等しくない場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しくない" fi echo "********* テスト完了 *********" ======================================================================= $ ./testsh110207.sh ./testsh110207.sh: line 6: [: too many arguments ./testsh110207.sh: line 13: [: too many arguments ********* テスト完了 *********

  • 文字列に関する関数

    現在C言語の勉強をしております。 そこで、以下の関数の作成について質問させてください。 【関数の仕様】 引数の文字列から、'-'(ハイフン)と'P'以降を排除した文字列を返す。 自分なりに作成してみたのですが、コンパイルで警告が出てしまう状況です・・・。 もっとスマートに書けるんだろうとは思っているんですが、精一杯でした・・・。 どなたか教えていただけませんでしょうか? char *getDelStr(char *str) { int len = strlen(str); int count; char targetStr[32]; for(count = 0; count < len; count++){ if(str[count] != 'P'){ if(str[count] != '-'){ strcat(targetStr,str[count]); } }else{ return targetStr; } } return str; } 以上、よろしくお願いいたします。

  • 特定文字列の次のトークンを取り出す

    バッチにて、以下文字列内のFROM以降の文字列の抽出を行いたいと考えてます。 <chusyutu.txt> FROM hogehoge FROM hogehoge pekepeke FROM hogehoge     ・     ・     ・ その場合、 for /f "delims=FROM" %%i IN ("chusyutu.txt") do (echo %%i >> result.txt) としてましたが、一部文字列が抽出できておらず、"ECHO は <OFF> です。"と表示されてしまって おります。上記、構文に問題ありますでしょうか。お教えて頂ければ幸いです。

専門家に質問してみよう