【问题标题】:preg replace remove the same repeated non-word characterpreg replace 删除相同的重复非单词字符
【发布时间】:2013-11-20 09:04:08
【问题描述】:

我想删除相同的重复非单词字符。

我的代码如下所示:

<?php
$name = 'Malines - Blockbuster (prod. Malines) ***** (((((( &%^$';
echo preg_replace('/[^\pL\pN\s]{2,}/u', '', $name);
?>

Malines - Blockbuster (prod. Malines) ***** (((((( &amp;%^$ 应该是Malines - Blockbuster (prod. Malines) &amp;%^$

只应删除重复的非单词字符。你能帮帮我吗?

【问题讨论】:

    标签: char preg-replace character


    【解决方案1】:

    您必须使用反向引用来说明第二个字符与前一个字符相同:

    /([^\pL\pN\s])\1+/u
    

    【讨论】:

    • 我试过这个,它取代了'Malines - Blockbuster (prod.Malines) ***** (((((((&%^$' to 'Malines - Blockbuster (prod.Malines) * &%^$' - 删除所有 "(" 但应该留下一个。
    • preg_replace('/([^\pL\pN\s])\1+/u', '\1', $name);
    【解决方案2】:

    使用与 Arlaud Agbe Pierre 相同的想法(就是这样做的方法),可以使用 Xan 字符类来缩短模式。 \p{Xan}\p{L}\p{N} 的并集。 \P{Xan}(带有大写“p”)是这个类的否定(即所有不是字母或数字的东西)。

    $str = 'Malines - Blockbuster (prod. Malines) ààà ***** (((((( &%^$';
    
    echo preg_replace('~(\P{Xan})\1+~u', '$1', $str);
    

    注意:在这种模式中,连续的白色字符也会被删除。

    另一种方式:

    echo preg_replace('~(\P{Xan})\K\1+~u', '', $str);
    

    其中\K 从匹配结果中重置匹配的开始。 (请注意,您可以先定义捕获组,然后再使用)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 2021-09-29
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      相关资源
      最近更新 更多