Php 正则表达式问题:用硬引号或软引号匹配此模式
我有一个很好的正则表达式:Php 正则表达式问题:用硬引号或软引号匹配此模式,php,regex,Php,Regex,我有一个很好的正则表达式: $p = '%<a.*\s+name="(.*)"\s*>(?:.*)</a>%im'; 使用[]匹配字符集: $p = "%<a.*\s+name=['\"](.*)['\"]\s*>(?:.*)</a>%im"; $p=“%使用[]匹配字符集: $p = "%<a.*\s+name=['\"](.*)['\"]\s*>(?:.*)</a>%im"; $p=“%试试这个: /<a(?
$p = '%<a.*\s+name="(.*)"\s*>(?:.*)</a>%im';
使用
[]
匹配字符集:
$p = "%<a.*\s+name=['\"](.*)['\"]\s*>(?:.*)</a>%im";
$p=“%使用[]
匹配字符集:
$p = "%<a.*\s+name=['\"](.*)['\"]\s*>(?:.*)</a>%im";
$p=“%试试这个:
/<a(?:\s+(?!name)[^"'>]+(?:"[^"]*"|'[^']*')?)*\s+name=("[^"]*"|'[^']*')\s*>/im
但是使用真正的解析器(比如)肯定比使用正则表达式方法要好。试试以下方法:
/<a(?:\s+(?!name)[^"'>]+(?:"[^"]*"|'[^']*')?)*\s+name=("[^"]*"|'[^']*')\s*>/im
但是使用一个真正的解析器(比如正则表达式)肯定比使用正则表达式更好。James的注释实际上是一个非常流行但用于字符串匹配的错误正则表达式。这是错误的,因为它不允许字符串分隔符转义。假设字符串分隔符为“或”,则以下正则表达式有效
$regex = '([\'"])(.*?)(.{0,2})(?<![^\\\]\\\)(\1)';
James注释实际上是一个非常流行但用于字符串匹配的错误正则表达式。它是错误的,因为它不允许转义字符串分隔符。如果字符串分隔符是“或”,则以下正则表达式有效
$regex = '([\'"])(.*?)(.{0,2})(?<![^\\\]\\\)(\1)';
您当前的解决方案不会将锚与“name”(例如
)后面的其他属性相匹配
尝试:
$regex = '%<a\s+\S*\s*name=["']([^"']+)["']%i';
$regex='%您当前的解决方案将无法将锚与“name”(例如
)后面的其他属性相匹配
尝试:
$regex = '%<a\s+\S*\s*name=["']([^"']+)["']%i';
$regex='%还有另一种方法:
$rgx='~<a(?:\s+(?>name()|\w+)=(?|"([^"]*)"|\'([^\']*)\'))+?\1~i';
$rgx='~。第一个非捕获组在不情愿的加号(+?
)控制下处理所有“name=value”对的匹配。如果属性名是字面上的name
,则空组(()
)不匹配任何内容,然后反向引用(\1
)再次不匹配任何内容,从而中断循环。(反向引用成功,因为该组参与了比赛,即使它没有使用任何字符。)
每次在组#2中捕获属性值,覆盖上一次迭代捕获的内容。(分支重置构造((?|(…)|(…)
使我们能够“重用”group#2以捕获引号内的值,无论它们是哪种类型的引号。)由于循环在出现名称名称
后退出,因此最终捕获的值对应于该属性
以下是另一种方法:
$rgx='~<a(?:\s+(?>name()|\w+)=(?|"([^"]*)"|\'([^\']*)\'))+?\1~i';
$rgx='~。第一个非捕获组在不情愿的加号(+?
)控制下处理所有“name=value”对的匹配。如果属性名字面上是name
,则空组(()
)不匹配任何内容,然后反向引用(\1
)再次不匹配任何内容,从而中断循环。(反向引用成功,因为该组参与了比赛,即使它没有使用任何字符。)
每次在第2组中捕获属性值时,都会覆盖上一次迭代中捕获的内容。(分支重置构造((?|(…)|(…))
使我们能够“重用”第2组以捕获引号内的值,无论它们是哪种引号。)由于循环在名称name
出现后退出,因此最终捕获的值对应于该属性
太棒了!非常感谢!最好使用php内置的DOMDocument+SimpleXML或DOMXPath(具体取决于…)如果使用分支重置构造,就不必手动删除引号:(?|“([^”]*)“|”([^']*)”([^']*))
。非常好!非常有魅力!非常感谢!最好使用php内置的DOMDocument+SimpleXML或DOMPXPath(具体取决于…)。如果使用分支重置构造,则不必手动删除引号:(?|“([^”]*)“|”([^']*)”([^']*))
.Hi pelms,谢谢你的回复。我尝试了你的正则表达式。不得不转义单引号。$regex='%Feh,对模糊不清的格式表示抱歉。$regex='%Hi pelms,谢谢你的回复。我尝试了你的正则表达式。不得不转义单引号。$regex='%Feh,对模糊不清的格式表示抱歉。$regex='%