【问题标题】:Regular Expression match vs replace正则表达式匹配与替换
【发布时间】:2021-04-10 02:33:14
【问题描述】:

我希望在 PHP 中开发多语言的标签系统,为此我将使用正则表达式机制,用于标签拆分并用超链接替换文本。

第一阶段哈希匹配将适用于给定的代码

$str = '#தமிழ் மாதங்களின் #வரலாறு';
preg_match_all('/#[^\s#]*/i', $str, $mat);

$mat 数组在输入字符串中包含所有哈希标签,例如 array([0]-#தமிழ்,[1] -#வரலாறு )

第二阶段用超链接替换散列标签,为正则表达式替换函数给出空结果,如下所示

$str = '#தமிழ்,#வரலாறு';
$expression = "/#[^\s#]*/i";        
$string = preg_replace($expression, '<a href="https://www.example.com/hash_tag?tag=$1">$0</a>', $str);

我的预期结果是 #தமிழ் மாதங்களின் #வரலாறு

如何修复这个正则表达式替换条件?

【问题讨论】:

    标签: php regex multilingual hashtag


    【解决方案1】:

    /#[^\s#]*/i 模式中,您不需要/i,因为取反字符类匹配除# 或包含大小写字符的空白字符之外的任何字符。

    在替换中,您使用 $0$1,它们是完全匹配和捕获组 1。但该模式目前没有捕获组。

    如果完整匹配应包含# 和不包含它的组1,您可以将模式更改为#([^\s#]+) 并重复字符类1+ 次以匹配# 之后的至少一个字符

    您可以省略使用preg_match_all,而只使用preg_replace

    echo preg_replace(
        '/#([^\s#]+)/',
        '<a href="https://www.example.com/hash_tag?tag=$1">$0</a>',
        '#தமிழ் மாதங்களின் #வரலாறு'
    );
    

    输出

    <a href="https://www.example.com/hash_tag?tag=தமிழ்">#தமிழ்</a> மாதங்களின் <a href="https://www.example.com/hash_tag?tag=வரலாறு">#வரலாறு</a>
    

    【讨论】:

    • 我得到了准确的结果
    猜你喜欢
    • 2012-05-16
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2011-10-11
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多