使用preg_match扩展缩写

时间:2017-01-17 20:32:28

标签: php regex preg-match

我试图在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|$)用于空格或字符串的结尾 - 这是否可以接受,如果不是,应该如何做?

2 个答案:

答案 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