是否有一个正则表达式可以匹配带有或不带有特殊字符的特定字符串?可以说,特殊字符不敏感。
喜欢céra
将匹配cera
,反之亦然。
有任何想法吗?
编辑:我想匹配带有或不带有特殊/重音字符的特定字符串。不仅是任何字符串/字符。
测试例:
$clientName = 'céra';
$this->search = 'cera';
$compareClientName = strtolower(iconv('utf-8', 'ascii//TRANSLIT', $clientName));
$this->search = strtolower($this->search);
if (strpos($compareClientName, $this->search) !== false)
{
$clientName = preg_replace('/(.*?)('.$this->search.')(.*?)/iu', '$1<span class="highlight">$2</span>$3', $clientName);
}
输出: <span class="highlight">céra</span>
如您所见,我要突出显示特定的搜索字符串。但是,我仍然想显示匹配字符串的原始(带重音)字符。
我想我必须将它与Michael Sivolobov的答案结合起来。
我想,我得工作,单独preg_match()
和preg_replace()
,对不对?
您可以使用该\p{L}
模式来匹配任何字母。
您必须u
在正则表达式后使用修饰符才能启用unicode模式。
范例: /\p{L}+/u
编辑:
尝试这样的事情。它应将重音替换为包含重音字母(单字符和unicode双重码)和未重音字母的搜索模式的重音。然后,您可以使用更正的搜索模式来突出显示文本。
function mbStringToArray($string)
{
$strlen = mb_strlen($string);
while($strlen)
{
$array[] = mb_substr($string, 0, 1, "UTF-8");
$string = mb_substr($string, 1, $strlen, "UTF-8");
$strlen = mb_strlen($string);
}
return $array;
}
// I had to use this ugly function to remove accents as iconv didn't work properly on my test server.
function stripAccents($stripAccents){
return utf8_encode(strtr(utf8_decode($stripAccents),utf8_decode('àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ'),'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY'));
}
$clientName = 'céra';
$clientNameNoAccent = stripAccents($clientName);
$clientNameArray = mbStringToArray($clientName);
foreach($clientNameArray as $pos => &$char)
{
$charNA =$clientNameNoAccent[$pos];
if($char != $charNA)
{
$char = "(?:$char|$charNA|$charNA\p{M})";
}
}
$clientSearchPattern = implode($clientNameArray); // c(?:é|e|e\p{M})ra
$text = 'the client name is Céra but it could be Cera or céra too.';
$search = preg_replace('/(.*?)(' . $clientSearchPattern . ')(.*?)/iu', '$1<span class="highlight">$2</span>$3', $text);
echo $search; // the client name is <span class="highlight">Céra</span> but it could be <span class="highlight">Cera</span> or <span class="highlight">céra</span> too.
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句