• ベストアンサー

preg_replace 英数字以外の文字の前後のスペースを削除

preg_replaceで 英数字の前後いずれかのスペースは残して それ以外のスペースを消したいのですが あ a間が消えてしまいます。(英数字前なので消さない) a aはのこるので英数字後のスペースは残せてます。 <?php $str = \"あ a a\"; $txt = preg_replace(\"/([^a-zA-Z\\d])\\s+/u\", \"$1\", $str); echo $txt;

  • PHP
  • 回答数1
  • ありがとう数1

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

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

たとえばこんな感じ <? $str="aaa"; delspace($str); $str=" aaa"; delspace($str); $str=" あああ"; delspace($str); $str="aaa "; delspace($str); $str="あああ "; delspace($str); $str="aaa bbb"; delspace($str); $str="あああ いいい"; delspace($str); $str="aaa あああ いいい bbb ccc"; delspace($str); function delspace($str){ $pattern="/(?<![0-9a-z])(\s)(?![0-9a-z])/i"; $str2=preg_replace($pattern,"",$str); print "'".$str."' =&gt; '".$str2."'<br>"; } ?>

tamurad007
質問者

お礼

完璧です ありがとうございました

関連するQ&A

  • preg_replaceで改行が含まれてしまう

    preg_replaceを使って置換をしようと思い、 $str = <<< END test test ;comment test END; $fstr = preg_replace("/;(.*$)/m", "<>;\\1<>", $str); echo $fstr; と言うようにやってみたのですが、置換した文字の後に改行が入ってしまいます どのようにすればいいのでしょうか?

    • ベストアンサー
    • 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における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
  • preg_replaceがうまくいきません

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

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

    こんにちは。 PHPのプログラミングで、preg_replaceを使用したいのですが、(どのようなものかはわかっています)使用方法がわかりません。 某スクリプトを見てみたところ、 (:\/\/\S+?) や、 (.*?) など、わけの分からないものがたくさん出てきました。 どこのサイトを見ても、まったくわからなかったので、 わかる方、詳しくご教授くだされば幸いです。

    • ベストアンサー
    • PHP
  • preg_match関数で4-16桁の英数字かどうかをチェックしたい

    こんにちは☆ PHPでログインIDの入力フォームを作成していて、ユーザーの入力した文字が半角英数字のみで4桁以上16桁以内であるかどうかをpreg_match関数を用いてパターンチェックしたいのですが、うまくいきません。 (全角かな等が入っていてもtrueが返ってしまう。) どなたかご存知でしたらご指摘下さいm(_ _)m -------------------現在までの状況------------------------------- $login_id = $_POST["POSTされたユーザ入力"]; $login_id = mb_convert_kana($login_id, "a"); if (!preg_match("/[a-zA-Z0-9]{4,16}/", $login_id)) { echo "エラーメッセージ"; } ----------------------------------------------------------------

    • ベストアンサー
    • PHP
  • php 指定文字列以降の削除

    phpにて半角スペース以降の文字列を問答無用で削除するというプログラムを作ろうとしてるのですが上手くいきません。 どうすればできますでしょうか? ご教授のほどよろしくお願いいたします。 ---- ソースコード $str = '2017/1/1 10-28'; if (preg_match("/ /", $str)){ $replace = str_replace(' ', '', $str); } echo $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がうまくできない

    <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
  • str_replaceとpreg_replace

    phpで、汎用環境で文字化けしそうな文字を,ad hoc に機種依存しない文字に置換する過程に関して質問させて頂きます。 例えば(株)を(株)に、置換等です。 宜しくお願いいたします。 こちらのページのコードで、 http://memo.xight.org/2006-06-19-13 もともと、以下のようなコードサンプルA(推測)が、 -----▼サンプルA $arr=array('\xE3\x8A\x91' => '(株)',………); foreach ($arr as $key => $val) {  $str_rep = preg_replace("/$key/", $val, $str_rep); } -----▲ こちらの方の指摘で、 http://blog.poyo.jp/archives.php/categ-1/year-2006/month-6/id-1150817399 -----▼サンプルB $arr=array('\xE3\x8A\x91' => '(株)',………); return str_replace( array_keys( $arr), array_values( $arr), $str); -----▲ コードサンプルBに、変更(改善?)されたようです。一見、なるほどと思うのですが、実際にサーバ上で試したところコードサンプルAは問題なく機能しますが、コードサンプルBは機能しません。(特殊文字にマッチしない) 私の環境の問題で機能しないだけなのか、サンプルBを提示していた方の早まりなのか、判断がつかずに困っています。 ただし、'\xE3\x8A\x91'のようなユニコード文字列を、(株)といった文字に打ち変えて実行すると、きちんと認識して、置換が行われます。 str_replaceとpreg_replaceの機能の違いによるものだと思ったのですが、今回、このコードを利用し、80,000件位のコメントに置換をかけようとしているため、少しでも早く軽く置換できる方法を探しております。 見た目的にはループで走査していくよりも、str_replaceでスパっと置換した方が早そうに感じるので、できるならばサンプルBのような書き方で置換する様をベンチマークしたいと考えております。 なぜ、コードサンプルBが機能しないのか、また、正常に機能させるためには何が必要なのか、アドバイス・ご教示頂けましたら幸いです。 ちなみにコードサンプルAの元は、以下かと思いますが、こちらはまったく問題なく機能することが確認できています。 http://www.happytrap.jp/blogs/2009/09/11/1393/

    • ベストアンサー
    • PHP

専門家に質問してみよう