我有一个正则表达式,用非中断连字符替换通常的连字符,如果它在单词中找到
preg_replace('@(?<= \w)-(?= \w)@xu','‑',$string);
但是有像"this is a link":http://example.com/funny-stuff-is-funny
这样的字符串,它们也被解析了。问题是由于链接内部的非中断连字符,进一步解析了这样的字符串中断。所以我需要或修改原始正则表达式以匹配链接,或者覆盖整个函数在另一个我将修复该行为。我尝试的第一种方式在此结束
'@((?<! http)[/\pL\pP]+\w)-(?= \w)@xu'
它匹配link":http://example.com/funny-
并仍然替换连字符。所以我采取了第二种方式并获得以下内容:
preg_replace( /* Fixing broken links with NON-BREAKING HYPHEN */
'@(https?\://[^\s]+)‑@',
'$1===-===', /* This is to make a better view */
preg_replace( /* NON-BREAKING HYPHEN inside of a word */
'@(?<= \w)-(?= \w)@xu',
'‑',
$string))));
有了这个,我们可以在链接中替换连字符。一个连字符:
"this is a link":http://example.com/funny-things-are===-===funny
我试图用‘U’
改变覆盖表达式的“贪婪”,但它似乎没有解决它,所以我正在寻求帮助。
=== UPD ===
我接受了preg_replace_callback()
作为一般概念的解决方案,但由于多字节编码,我不得不在其中使用preg_replace()
。
答案 0 :(得分:1)
一般方法是使用自定义回调。如果您想采用fix-broken-links方式,请尝试以下操作:
$string = '"a dumb-ass car":http://example.com/funny-stuff-is-funny - funny-enough?';
echo preg_replace_callback( /* Fixing broken links with NON-BREAKING HYPHEN */
'@https?\://[^\s]+‑[^\s]+@u',
function ($matches) {
return str_replace('‑', '$1===-===', $matches[0]);
// or better, use strtr() for one-character replacement:
// return strtr($matches[0], '‑', '-');
},
preg_replace( /* NON-BREAKING HYPHEN inside of a word */
'@(?<= \w)-(?= \w)@xu',
'‑',
$string));