【问题标题】:Trim substrings within PHP regular expressions修剪 PHP 正则表达式中的子字符串
【发布时间】:2014-01-07 15:30:39
【问题描述】:

我有一个字符串,其中可能包含如下模式:

LINK([anchor text],[link])

我想做的是把这个表达式转换成一个 HTML 链接:

<a href="link">anchor text</a>

目前,我正在使用以下 PHP sn-p 执行替换:

$string = 'LINK(  some anchor text    ,   http://mydomain.com  )';
$search = '/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)/';
$replace = '<a href="$2">$1</a>';
preg_replace($search, $replace, $string);

我面临的问题是锚文本后的空格。幸运的是,在 HTML 中,多个空格被解释为一个空格,但在此示例中,我将显示一个带有(下划线)烦人空格的链接。有没有办法修剪这个锚文本?我不能将其视为“链接”子字符串,因为它可能包含空格。

【问题讨论】:

标签: php regex whitespace


【解决方案1】:

假设锚文本不能包含逗号或连续超过 1 个空格,您也许可以使用:

LINK\s*\(\s*([^\s,]+(?:\s[^\s,]+)*)\s*,\s*(\S+)\s*\)

regex101 demo

我使用的是[^\s,]+(?:\s[^\s,]+)* 而不是.+,它将匹配一个单词,以及更多由空格分隔的单词(其中一个单词是一系列至少包含一个字符的非空格字符)。

还将您的否定类 [^\s] 更改为稍后出现的 \S。

【讨论】:

  • 干得好@Jerry!这就是我一直在寻找的。我已经将模式稍微编辑为LINK\s*\(\s*([^\s]+(?:\s[^\s]+)*)\s*,\s*(\S+)\s*\),因为我的意图是在锚文本中也允许逗号。谢谢!
  • @Giorgio 好的,很酷!如果没有这些逗号,您可能会获得更多开销,但如果这会使正则表达式更加灵活!请注意,由于您删除了逗号,您实际上可以使用\S 而不是[^\s] :)
【解决方案2】:

您可以使相关的量词惰性,这样它们就不会占用, 或) 之前的空格:

'/LINK\(\s*(.+?)\s*,\s*([^\s]+?)\s*\)/'

在+ 之后添加?。

Test

【讨论】:

  • @Giorgio Me 和 Arphrial 的想法是一样的 :)
【解决方案3】:

在这种情况下,您可以做的是将第一组更改为惰性组。

$search = '/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)/';

可以改为:

$search = '/LINK\s*\(\s*(.+?)\s*,\s*([^\s]+)\s*\)/';

注意加号后面的问号。这告诉程序使用最少的字符来匹配它。

在这种情况下,它可以匹配的 laziest 是一个字符串,后跟任意数量的空格,然后是一个逗号。

在最初的情况下,它会贪婪地匹配。这意味着它将尝试匹配可能的最大字符数,导致.+ 匹配所有字符,直到逗号。

这里是a regex101的代码。

【讨论】:

  • 因为我认为你和 Jonny5 是同时写的,所以也为你 +1!谢谢。
猜你喜欢
  • 2011-02-25
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多