使用数组的php preg_replace - 带有重音字符的第一个或最后一个字母不起作用

时间:2018-04-16 01:26:22

标签: php arrays preg-replace diacritics

在这个例子中,我有单词así,结尾于重音的i字符。

 $str = "A string containing the word así which should be changed to color purple";

  $prac[] = "/\basí\b/i";
  $prac2[] = "<span class='readword'  style='color:purple'>\$0 </span>";

 $str= preg_replace($prac,$prac2,$str);

 echo $str;

它不会改变。但是,如果我有一个单词没有结束或以重音字符开头,它就会改变。例如:

 $str = "A string containing another word which should be changed to color 
  purple";
  $prac[] = "/\banother word\b/i";
  $prac2[] = "<span class='readword'  style='color:purple'>\$0 </span>";

 $str= preg_replace($prac,$prac2,$str);

 echo $str;
 ?>

如果重音位于单词的中间,它总是有效。我还测试了数组本身和preg_replace本身的单词。使用数组或preg_replace的单词似乎没有问题。只有当我在preg_replace中使用数组作为参数时才会这样做。

请帮助,无论如何都找不到任何相关信息。

谢谢

2 个答案:

答案 0 :(得分:3)

显然,PHP的重音字符被认为是一个单词边界,匹配单词边界{3}的3个条件是:

  
      
  • 在字符串中的第一个字符之前,如果第一个字符是单词字符。
  •   
  • 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
  •   
  • 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
  •   

来源:https://www.regular-expressions.info/wordboundaries.html

因此,当您使用\b匹配字符串中的/\basí\b/i时,它不会导致满足3个引用条件中的任何一个,第一个和第二个是明显的,因为{{1} }位于字符串的中间,第三个表示要匹配字符串中的así,我们需要两个字符,其中一个是单词字符而另一个不是,这里我们有así和空格\b这两个都不是单词字符。

毕竟不确定我的理解是否正确。

对于解决方案,您可以用í

替换您的reg exp

同时检查Regex word boundary issue when angle brackets are adjacent to the boundary

http://php.net/manual/en/function.preg-replace.php#89471

答案 1 :(得分:2)

使用unicode标志:

$str = "A string containing the word así which should be changed to color purple";
$prac[] = "/\basí\b/iu";
#             here __^
$prac2[] = "<span class='readword'  style='color:purple'>\$0 </span>";
$str= preg_replace($prac,$prac2,$str);
echo $str;

给定示例的结果:

A string containing the word <span class='readword'  style='color:purple'>así </span> which should be changed to color purple