【问题标题】:Regex match and replace of IDs正则表达式匹配和替换 ID
【发布时间】:2022-01-03 11:31:10
【问题描述】:

我正在尝试对遵循这些模式的字符串进行匹配和替换:

text_text_text
text_text
text_123

基本上是字母数字和一个或多个下划线。

替换基本上只是接受匹配并为其添加粗体标记。

到目前为止我有这个,但它基本上与我内容中的大部分文本匹配:

$description = preg_replace(
"~[[:alnum:]+_]+~",
"<b>\\0<\b>",
$description);

感谢任何帮助。

【问题讨论】:

  • 为什么字符集中有+?我以为你只是想匹配字母、数字和下划线。
  • $0 是首选而不是 \\0
  • 我现在编辑为~[[:alnum:]\_]+~ 并替换为&lt;b&gt;$0&lt;/b&gt;。但是我仍然在做一些非常愚蠢和错误的事情,因为它也一直匹配所有其余的文本。如何使下划线成为强制性并在任何空格处停止?
  • 我希望您内容中的大部分文字都是字母和数字。为什么不匹配呢?
  • 是否应该仅在至少有一个下划线时才匹配?

标签: php regex


【解决方案1】:

如果您只想在至少有一个下划线时进行匹配,则必须将其设为必需字符,而不是字符集的一部分。

$description = preg_replace('~([[:alnum:]]+_)+[[:alnum:]]+~', '<b>$0</b>', $description);

【讨论】:

    【解决方案2】:

    尝试以下方法,看看它是否符合您的要求:

    $description = preg_replace(
      '~(?:[[:alnum:]]+)(?:_[[:alnum:]]+)+~', 
      '<b>$0</b>', 
      $description
    );
    

    解释:

    • ~分隔符

      • (?:非捕获组开始

        • [开始字符类
          • [:alnum:] 匹配字母数字字符
        • ]结束字符类
        • + 匹配字符类 1 次或多次
      • )结束非捕获组

      • (?: 非捕获组开始

        • _ 匹配下划线
        • [开始字符类
          • [:alnum:] 匹配字母数字字符
        • ]结束字符类
        • + 匹配字符类 1 次或多次
      • )结束非捕获组

      • + 匹配非捕获组 1 次或多次

    • ~分隔符


    Online demo

    【讨论】:

    • 感谢您的补充说明!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2011-09-15
    • 2012-11-23
    • 2013-12-06
    相关资源
    最近更新 更多