2017-01-17 6 views
0

PHPでpreg_matchという表現を使用して一般的な略語を返してから、それらをフルバージョンの単語( "St."が "Street"になる)に置き換えようとしています。データベース。preg_matchを使用して略語を展開する

これは、略語、完全省略形、オプションの "。"、および文字列または空白の末尾のいずれかに一致する必要があることを意味します(Stationに一致しないようにする)。私は試しました:

preg_match("#\s(S|s)t\.?\s#" , $my_string , $matches) 
preg_match("#(\s(S|s)t\.?)+(\s|$)+#" , $my_string , $matches) 
preg_match("#(\s{1}(S|s){1}t{1}\.?){1}\s{1}#" , $my_string , $matches) 

私は期待していないし、なぜわからない。これは、ケース内の対応するマッチ "聖" を返しarray (" St.", " St." , "S")

:。

第一$試合:array (" St." , "S")

第二:array (" St." , " St." , "S", " ")

第三$my_string = "My St. and something else" 「st。」、「St」、または「st。」に置き換えられます。

これらのケースで一致を1つのインスタンスに限定するにはどうすればよいですか?

機能的には、最初のマッチだけが置換されるため、対応する置換が機能するように見えますが、1つのマッチに絞り込む必要があるように感じられます。

2番目の質問では、上記の2番目のpreg_match()では、空白または文字列の末尾に(\s|$)を使用しようとしています。これは受け入れ可能かどうか、どうすればよいでしょうか?

+0

ます。https:// regex101。 – yivi

答えて

0

あなたが行う場合this

preg_match("#(?<=\s)([Ss]t\.?)\s#" , $my_string , $matches); 

配列$マッチの最初の要素は「聖」(完全一致)を持ち、2番目の要素は、「聖」、一部お持ちします交換したい

するのではなく、先行する空白と一致し、末尾の1を避ける場合:

preg_match("#(\s[Ss]t\.?)(?>\s)#" , $my_string , $matches); 

あなたはhere作業秒1を見ることができます。あなたがhere作業全体を見ることができます

$patterns  = []; 
$replacements = []; 
$string  = "The St. Leicester Square is near a statue located somewhere. 
The train left the St"; 

$patterns[]  = "#(?<=\s)([Ss]t\.?)(?=\s|$)#m"; 
$replacements[] = "station"; 

echo preg_replace($patterns, $replacements, $string); 

まあ、完全酒のために、私は多かれ少なかれ、このような何かをしたいです。

+0

デバッガとテスターへのリンクは非常に便利です!ありがとう。しかし、私が探しているのは "St."か "St." (文字列の終わりの場合)。おそらく、置き換えを "Street"と指定する方が簡単でしょう。だから私は後ろのスペースと一致しないように先読みをしたいかもしれないと思っていて、lookbehindを削除しますか? また、2つの一致を返します...これは問題ではありませんか?最初の試合は常に最長と思われる。 – rotaryspd

+0

これはおそらく '#(\ s [Ss] t \。?)(?= \ s)#' 編集:いいえ、まだ2つの一致 – rotaryspd

+1

ああ、それを持っています!実際に '#(?<= \ s)([Ss] t \。?)(?= \ s)#'を使用し、代わりに「ストリート」ではなく「ストリート」を使用しました。また、私はちょうど2つの一致が正常な動作であることを読んでいます。 – rotaryspd

1

あなたは負の前後参照を使用してそれを行うことができます。

/(?<!\S)st\.?(?!\S)/i 

あなたが交換する必要がある一部の周りのすべての空白を一致させる必要はありません。この方法:

$str = preg_replace('/(?<!\S)st\.?(?!\S)/i', 'Street', $str); 
関連する問題