• ベストアンサー

preg_replaceの使い方が分からないのですが

$z=" abcd !00! ouafd \n !00! af \n "; $z=preg_replace("/\s/g",'',$z); $z=preg_replace("/!00!.*$/",'',$z); によってabcdを出そうとしたのですができません どうしたらいいでしょうか?

  • guuman
  • お礼率86% (1043/1206)
  • PHP
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
回答No.4

No3です。 マニュアルはちゃんとご覧になっていますか? http://phpspot.net/php/man/php/function.preg-replace.html 「後ろにつける」というのはどこでご覧になりましたか?もしくは誰かに教えられたのでしょうか。 最初に見つかった空白を削除したいのなら preg_replace("/\s/" , "" , $z , 1); // preg_replace の第四引数に注目 行頭の空白を削除したいなら preg_rplace("/^\s/" , "" , $z); // 正規表現でマッチさせる と色々パターンがあります。 PHPのマニュアルは他の言語マニュアルの中でも一番易しく書かれていますし、豊富にあります。おっくうにならずに、まずマニュアルで調べてみてください。 なお、正規表現のパターンに関しては http://www2.famille.ne.jp/~akio1998/l_grep.html こちらをご覧ください。

guuman
質問者

お礼

ありがとうございます 読んだつもりがいっぱいあってので読み落としていたみたいです

その他の回答 (3)

回答No.3

こんにちは。 質問内容から推測すると、Perl言語やられてませんでしたか? おっしゃられている /\s/g の 「 g 」は「マッチ演算子」と呼ばれるものです。「 g 」ということなので「マッチするものすべて」という意味で使われたのでしょうが、マッチ演算子の場合は、 g/\s/ が、正しい使い方です。位置が違いますね。 /\s/i のように後ろにつくものを「パターン演算子」といい、 「 i 」をはじめいくつかありますが、「 g 」はありません。 http://php.s3.to/man/pcre.pattern.modifiers.html 上のURLをご参考にしてください。

guuman
質問者

お礼

ありがとうございます gをつけられないのですね gをつけなくても繰り返して変換してくれるのですが1回だけ変換させるには後ろにつけないといけないのでしょうか?

  • BENGAL
  • ベストアンサー率73% (22/30)
回答No.2

$z=" abcd !00! ouafd \n !00! af \n "; $z=preg_replace("[\s]",'',$z); $z=preg_replace("/!00!.*$/",'',$z); で、いかがですか?

guuman
質問者

補足

ありがとうございます $z=" a\nb cd !00! ouafd \n !00! af \n "; $z=preg_replace("/\s/",'',$z); $z=preg_replace("/!00!.*$/",'',$z); で動きました /\s/を/\s/gにしていたためにうまくいかなかったみたいです /\s/にgをつけなくてもPreg_replaceは繰り返し変換してくれるみたいです 逆に/\s/にその意味でgをつけたらoutみたいです どうもpreg_replaceの動作が分からないですね

  • randman
  • ベストアンサー率51% (17/33)
回答No.1

$z=preg_replace("/.+?(abcd).+/s","\\1",$z); てゆーか、抽出する文字列が定まっているんなら、preg_matchでマッチさせた方がいいんじゃない?↑のやり方じゃ、2回以上「abcd」が出現しても対応できないし。

guuman
質問者

補足

ありがとうございます 誤解させてしまいました abcdを抜き出すのではありません スペースや改行やタブ等スペース文字をすべて取り外して 最初の!00!以降を削除したいのです 例えば $z=" x y\nz !00!abcd !00! ouafd \n !00! af \n "; の場合には "xyz" にならなければならないのです

関連するQ&A

  • preg_replaceがうまくできない

    <br />を\nに置き換えてやりたいと思っています。 $a = preg_replace("<br\s/>", "\n", $a); としたのですが、 変換前が あ<br />い 変換後が あ< >い となりました。 <>が括っているものとしてとられているようでしたので、次のように\でエスケープしてみました。 $a = preg_replace("\<br\s/\>", "\n", $a); そうしたら変換後は何も出てきませんでした。(データがなかった) そこで $a = preg_replace("/<br\s\/>/", "\n", $a); としてみたのですが、変換前と変わりませんでした \sを普通に半角スペースにもしてみましたし、括っているダブルクオーテーションをシングルクオーテーションに変えてもみましたが、結果は同じでした。 <br />全体を\nに変換するにはどうすればいいでしょうか。

    • ベストアンサー
    • PHP
  • preg_replaceについて

    $text = "今日財布を拾った。"; $value = "100円"; $pattern = "/(今日).*(を拾った。)/"; $replace = sprintf("\\1%s\\2"); $text = preg_replace($pattern, $replace, $text); のような処理を行ったとき、 うまく$textに結果が格納されません。 $valueの最初の文字が数字で無い場合は うまくいきますが、"100円"のように数字で 始まっていると、うまくいきません。 良い回避方法は無いでしょうか?

    • ベストアンサー
    • PHP
  • preg_replace 後方参照

    preg_replace関数の外で後方参照を行うことはできないですか? $str = '1234abcde' $str = preg_replace("/^(\d+)/", "", $str); この結果は、$str = 'abcde' ですが、()内の数字つまり1234をpreg_replaceの外で確認するには、 $matches = array(); if(preg_match("/^(\d+)/", $str, $matches)){  $str = preg_replace("/^\d+/", "", $str);  $tmp = $matches[1]; //参照 } という風にpreg_matchと併用するしか方法はないのでしょうか? (  perl でいう $str =~ s/^(\d+)//; $tmp = $1; というようなことをしたい。 )

    • ベストアンサー
    • PHP
  • preg_replace ereg_replace

    いつもお世話になっております。 データを抽出する前にサニタイズが必要となり、 実行する処理で、 $rep = "/\\\/"; $arr = array('data1' => 'A', 'data2' => '\\\\\\'); $ret = preg_replace($rep , "\\\\\\" ,$arr ); $ret = ereg_replace("'", "\'" ,$ret); preg_replaceは配列で戻ってくる事は知っているのですが、 ereg_replaceは配列で戻ってくるのでしょうか。 お手数ですが、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • preg_replaceがうまくいきません

    何度見なおしても原因がわからないので、どなたかご指摘よろしくお願いいたします。 <?php $urs='母親からのプレゼント'; preg_replace('/母親/m','父親',$urs); echo $urs; ?> replace表現が間違っているとは思えませんし、どこがおかしいのでしょうか。

    • ベストアンサー
    • PHP
  • preg_replaceでの警告

    PHP5.2.4を使用しています。 CakePHPというフレームワークの中の関数で、次のような Warning (2): preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 6 という警告がでるのですが、preg_replace関数の第4引数を指定してないからなのかな?と思い、 1という数字を指定してみたりしたのですが、同じような警告が出てしまいます・・・ たぶんバージョン間の違いだと思いますが、 この場合は、たとえば警告を出さないフラグを変更する以外に preg_replace関数をどのように記述すれば良いのでしょうか? function slug($string, $replacement = '_') { if(!class_exists('String')) { require_once LIBS . 'string.php'; } $map = array( '/a|a|a|a/' => 'a', '/e|e|e|?|e/' => 'e', '/i|i|i/' => 'i', '/o|o|o|o/' => 'o', '/u|u|?|u/' => 'u', '/c/' => 'c', '/n/' => 'n', '/a|a/' => 'ae', '/o/' => 'oe', '/u/' => 'ue', '/A/' => 'Ae', '/U/' => 'Ue', '/O/' => 'Oe', '/s/' => 'ss', '/[^\w\s]/' => ' ', '/\\s+/' => $replacement, String::insert('/^[:replacement]+|[:replacement]+$/', array('replacement' => preg_quote($replacement, '/'))) => '', ); /* print "string=$string<br>\n"; print_r(array_keys($map)); print_r(array_values($map)); */ $string = preg_replace(array_keys($map), array_values($map), $string); return $string; } string=test<br> Array ( [0] => /a|a|a|a/ [1] => /e|e|e|?|e/ [2] => /i|i|i/ [3] => /o|o|o|o/ [4] => /u|u|?|u/ [5] => /c/ [6] => /n/ [7] => /a|a/ [8] => /o/ [9] => /u/ [10] => /A/ [11] => /U/ [12] => /O/ [13] => /s/ [14] => /[^\w\s]/ [15] => /\s+/ [16] => /^[_]+|[_]+$/ ) Array ( [0] => a [1] => e [2] => i [3] => o [4] => u [5] => c [6] => n [7] => ae [8] => oe [9] => ue [10] => Ae [11] => Ue [12] => Oe [13] => ss [14] => [15] => _ [16] => )

    • 締切済み
    • PHP
  • preg_replace, ereg_replace

    $bodyにはテキストファイルなどから読み込んだ、$dateと言う文字(変数ではない)と、改行を含む文字列。 それで、「$date」を、phpスクリプト上の$dateの値に置換したく、 $tmp = preg_replace("/\$date/s", $date, $body); または、 $tmp = ereg_replace("\$date",$date,$body); としたのですが、どうも置換されません。何がいけないのでしょうか?

    • ベストアンサー
    • PHP
  • PHPのpreg_replaceについて

    文字列に半角、全角があったら''に置換したいです。 例)あ あ あ -> あああ 上記のように。 ソースは下記のとおりしてみたのですがうまく表示されませんでした。 $string = 'あ あ あ'; $pattern = '[ \t\n\r\f]'; $replacement = ''; $var_dump(preg_replace($pattern,$replacement, $string)); 他には $string = 'あ あ あ'; $pattern = '[[:space:]]'; $replacement = ''; $var_dump(preg_replace($pattern,$replacement, $string)); などと行ってみました。 ご教授お願いいたします。

    • 締切済み
    • PHP
  • preg_replaceでの正規表現について

    お世話になります。 ereg_replace で書いた正規表現による置換処理を、 preg_replace に置き換えようとしています。 (preg_replaceの方が処理が速いとマニュアルにあったので) ところが、preg_replaceでの正規表現検索がうまくいかないで困っています。 基本的には、ereg_replaceの正規表現部分を//で囲んでいるだけです。 具体的には、下記のような処理を書いています。 間違いがあれば、ご指摘いただけましたら幸いです。 //### うまくいっている ereg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='\{dokuji tag\}.+\{_dokuji tag\}'; $replace=''; $html=ereg_replace($search,$replace,$html); //不要部分の削除 //### うまくいっている ereg_replace のパターン ここまで ### ↓ //### うまくいかない preg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='/\{dokuji tag\}.+\{_dokuji tag\}/m'; $replace=''; $html=preg_replace($search,$replace,$html); //不要部分の削除 //### うまくいかない preg_replace のパターン ここまで ### //### 置き換えるソース('template/temple.html') ここから ### <!-- {dokuji tag} --> <tr> <td nowrap><strong>タイトル:</strong></td> <td> <input type="text" name="name" size="80" value="{name}" /> </td> </tr> <!-- {_dokuji tag} --> //### 置き換えるソース('template/temple.html') ここまで ### よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • preg_replaceにおけるeオプション

    文字列$strは、「aa:bb」という文字列を含み、$flagが1のときは、この部分を「aa」に。0のときは「bb」に置き換えるという処理で、 $str = preg_replace("/(.*):(.*)/e","($flag) ? $1 : $2", $str); とするも、うまくできません。 http://www.jp.u4ia.net/~tkyng/php/php_manual_i18n/function.preg-replace.html こちらのサイトの一番下にe修飾の使い方がのっているのですが、これを真似てもうまくいきません。 e修飾の使い方を教えてください。

    • ベストアンサー
    • PHP

専門家に質問してみよう