大きな文字列 ($str) から GP123 (任意の順序の数字と文字で構成される文字列) を取り出し、別の変数の文字列となる Hello ($str1) を除外したいと考えています。私のコードはこれです。しかし、それは機能していません。文字列の一部を削除するにはどうすればよいですか。
$str=" HelloGP123";
$str1="Hello";
preg_match_all("/(?:$str1)\w+\d+\w+/",$str,$str2);
print_r($str2);
大きな文字列 ($str) から GP123 (任意の順序の数字と文字で構成される文字列) を取り出し、別の変数の文字列となる Hello ($str1) を除外したいと考えています。私のコードはこれです。しかし、それは機能していません。文字列の一部を削除するにはどうすればよいですか。
$str=" HelloGP123";
$str1="Hello";
preg_match_all("/(?:$str1)\w+\d+\w+/",$str,$str2);
print_r($str2);
私の必要性は、$ str(HelloGP123)から$ str1(Hello)の部分を消去し、最後の残りを$str2に格納することだけでした。そして、私は正規表現を一周していました。
しかし、文字列を置き換えることで、これをはるかに簡単に解決できることに気づきました。これが私がしたことで、うまくいきました。
$str2= str_ireplace($str1, '', $str);
これは、正規表現のさまざまな組み合わせを試して脳を襲うよりも最も簡単な方法だと思います。
preg_replace("/hello/","","hellogp123");
なぜ上記のものではないのですか?
$pattern = sprintf('/(?<=%s)[a-zA-Z0-9]+/', preg_quote($str1, '/'));
if (preg_match($pattern, $str, $matches)) {
$str2 = $matches[0];
}
これは、文字や数字の任意の組み合わせに一致しますが、に含まれる文字列の直後の組み合わせにのみ一致します$str1
。
ここでの例-http://codepad.viper-7.com/okY8TP
こちらもご覧ください-http://www.regular-expressions.info/lookaround.html
$string="HelloGP123";
$pattern="/Hello/";
echo preg_replace($pattern, "", $string);
コードが機能しない理由はいくつかあります。
(?:$str1)
、文字列内の「hello」と実際に一致させようとしています。これは(?:)
、非キャプチャ サブパターンであるためです。これは、結果の何も返されないことを意味するわけではありませんが (これは、使用しようとしているようです)、サブパターンは独自のものとして返されません。一致の配列のエントリ。\w+\d+\w+
「1 つまたは複数の単語文字の後に 1 つまたは複数の数字が続き、その後に 1 つまたは複数の単語文字が続く」ことを意味します。ここで、「単語」文字は文字、数字、またはアンダースコアです。これは、あなたが一致させようとしていると言うものではありません。あなたが言っていることを実行するコードは次のとおりです。
$str_minus_str1 = preg_replace('/'.preg_quote($str1,'/').'/',' ',$str);
preg_match_all('/[0-9A-Za-z]+/',$str_minus_str1,$matches);
$str1 を削除するのではなく、文字列内の ' ' に置き換えたことに注意してください。 「applebanana」にちょうど一致します。
全体を単一の文字列として返したい場合は、それが意図しているように見えますが、次の行に沿って何かを使用して一致を内破する必要があります。
$str2 = implode('',$matches);