修剪PHP正则表达式中的子字符串
我有一个字符串,其中可能包含如下模式:修剪PHP正则表达式中的子字符串,php,regex,whitespace,Php,Regex,Whitespace,我有一个字符串,其中可能包含如下模式: LINK([anchor text],[link]) 我要做的是将此表达式转换为HTML链接: <a href="link">anchor text</a> 目前,我正在使用以下PHP代码片段进行替换: $string = 'LINK( some anchor text , http://mydomain.com )'; $search = '/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)
LINK([anchor text],[link])
我要做的是将此表达式转换为HTML链接:
<a href="link">anchor text</a>
目前,我正在使用以下PHP代码片段进行替换:
$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);
$string='链接(一些锚文本,http://mydomain.com )';
$search='/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)/';
$replace='';
preg_replace($search,$replace,$string);
我面临的问题是锚文本后的空格。幸运的是,在HTML中,多个空格被解释为一个空格,但在本例中,我将显示一个带有(下划线)恼人空格的链接。有没有办法修剪这个锚文本?我不能将其视为“链接”子字符串,因为它可能包含空格。假设锚文本不能包含逗号或一行中包含多个空格,您可以使用:
LINK\s*\(\s*([^\s,]+(?:\s[^\s,]+)*)\s*,\s*(\S+)\s*\)
我使用的不是+
,而是[^\s,]+(?:\s[^\s,]+)*
,它将匹配一个单词和多个由空格分隔的单词(其中一个单词是一系列至少有一个字符的非空格字符)
还将随后出现的否定类
[^\s]
更改为\s
假设锚文本不能包含逗号或一行中包含多个空格,您可能可以使用:
LINK\s*\(\s*([^\s,]+(?:\s[^\s,]+)*)\s*,\s*(\S+)\s*\)
我使用的不是+
,而是[^\s,]+(?:\s[^\s,]+)*
,它将匹配一个单词和多个由空格分隔的单词(其中一个单词是一系列至少有一个字符的非空格字符)
还将您的否定类
[^\s]
更改为\s
您可以使相关的量词变懒,这样它们就不会占用,
或之前的空格了。
:
在+
之后添加?
你可以让相关的量词变懒,这样它们就不会占用
、
或之前的空格了。
:
在+
之后添加?
在这种情况下,您可以做的是将第一个组更改为惰性组
$search = '/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)/';
可更改为:
$search = '/LINK\s*\(\s*(.+?)\s*,\s*([^\s]+)\s*\)/';
注意加号后面的问号。这告诉程序使用最少的字符数来匹配它
在本例中,它所能匹配的最慢值是字符串,后跟任意数量的空格,然后是逗号
在最初的情况下,这将是贪婪的匹配。这意味着它将尝试匹配尽可能多的字符,从而使+
匹配所有字符,直到逗号
这是一段代码。在这种情况下,您可以将第一个组更改为惰性组
$search = '/LINK\s*\(\s*(.+),\s*([^\s]+)\s*\)/';
可更改为:
$search = '/LINK\s*\(\s*(.+?)\s*,\s*([^\s]+)\s*\)/';
注意加号后面的问号。这告诉程序使用最少的字符数来匹配它
在本例中,它所能匹配的最慢值是字符串,后跟任意数量的空格,然后是逗号
在最初的情况下,这将是贪婪的匹配。这意味着它将尝试匹配尽可能多的字符,从而使+
匹配所有字符,直到逗号
这是一段代码。可能回调中有一些代码来处理修剪,也可能是实际的替换可能是重复的,可能回调中有一些代码来处理修剪,也可能是实际的替换可能是重复的Nice job@Jerry!这就是我要找的。我稍微将模式编辑为
LINK\s*\(\s*([^\s]+(?:\s[^\s]+)*)\s*,\s*(\s+)\s*)
,因为我的意图是在锚文本中也允许逗号。谢谢大家!@乔治好吧,酷!如果没有这些逗号,您可能会得到更多的开销,但如果这使正则表达式更灵活的话!请注意,由于删除了逗号,您实际上可以使用\S
而不是[^\S]
:)干得好@Jerry!这就是我要找的。我稍微将模式编辑为LINK\s*\(\s*([^\s]+(?:\s[^\s]+)*)\s*,\s*(\s+)\s*)
,因为我的意图是在锚文本中也允许逗号。谢谢大家!@乔治好吧,酷!如果没有这些逗号,您可能会得到更多的开销,但如果这使正则表达式更灵活的话!请注意,由于您删除了逗号,您实际上可以使用\S
而不是[^\S]
:)因为我认为您和Jonny5是在同一时间编写的,+1也代表您!谢谢。因为我认为你和Jonny5是在同一时间写的,+1也为你!谢谢。@Giorgio Me和Arphrial同时思考:)@Giorgio Me和Arphrial同时思考:)