我试图在php中使用preg_match
表达式来返回常用缩写,然后将其替换为单词的完整版本(即" St。"变为&# 34; Street")然后将它们添加到数据库中。
这意味着它需要匹配缩写之前的空格,完整的缩写,可选的"。",以及字符串或空格的结尾(以便不返回&#34的匹配) ;车站&#34)。我试过了:
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 )
我得到的比赛我不期望也不确定为什么。
当$my_string = "My St. and something else"
:
第一场$匹配:array ( " St." , "S" )
第二名:array ( " St." , " St." , "S", " " )
第3名:array ( " St.", " St." , "S" )
它返回相应的匹配情况" St。"被替换为" st。"," St"或" st。"。
在这些情况下,如何将匹配范围缩小到仅一个实例?
功能上相应的替换似乎有效,因为它只取代了第一场比赛,但我觉得我应该能够缩小到一场比赛。
还有一个次要问题,在上面的第二个preg_match()
我尝试将(\s|$)
用于空格或字符串的结尾 - 这是否可以接受,如果不是,应该如何做?
答案 0 :(得分:1)
你可以使用负面外观来做到这一点:
/(?<!\S)st\.?(?!\S)/i
这样您就不需要匹配需要替换的部分周围的任何空格:
$str = preg_replace('/(?<!\S)st\.?(?!\S)/i', 'Street', $str);
答案 1 :(得分:0)
如果你this:
preg_match( "#(?<=\s)([Ss]t\.?)\s#" , $my_string , $matches );
数组$ matches的第一个元素将包含&#34; St。 &#34; (完全匹配),第二个元素将包含&#34; St。&#34;,您要替换的部分。
如果您更喜欢匹配前面的空白并避开尾随空白:
preg_match( "#(\s[Ss]t\.?)(?>\s)#" , $my_string , $matches );
您可以看到第二个工作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);
你可以看到整个工作here。