正则表达式:(* SKIP)之后匹配字符串开头(* F)

时间:2018-01-19 23:04:16

标签: php regex

表达式<[^>]*>(*SKIP)(*F)|(\/|\s|^|\()(Dakota Ridge.*?)(,|\.|\s|\b|\)|<)符合预期字符串Dakota Ridge中的The Dakota Ridge Trail is open.

但是,如果我将Dakota Ridge Trail包裹在HTML标记中,则该字符串将不再匹配:The <b>Dakota Ridge Trail</b> is open.

我认为^替代方案会断言字符串是在开始时锚定的,因为(*SKIP)会阻止引擎回溯到该点,但显然它不会那样工作。

如果在跳过且失败的匹配后字符串锚定在第一个位置,如何修改此表达式以匹配?

编辑以澄清:<[^>]*>(*SKIP)(*F)的目的是跳过可能包含模式的HTML标记。

1 个答案:

答案 0 :(得分:1)

你的正则表达式与第二次匹配不匹配,因为你要匹配的子字符串前面有一个>,它在SKIP-FAIL完成其工作后被消耗并被丢弃。这意味着(\/|\s|^|\()模式无法匹配Dakota之前的空格,因为它不是/,也不是空格,字符串的开头或(

由于您在尾随位置有一个\b字边界,您也可以在租赁位置使用它,并进一步使用外观限制上下文(例如,lookbehind)。

对于当前场景,以下内容将执行:

<[^>]*>(*SKIP)(*F)|\b(Dakota Ridge.*?)\b

请参阅regex demo

<强>详情

  • <[^>]*>(*SKIP)(*F) - 匹配<,然后是>以外的0 +字符,然后是>,并丢弃匹配,保持正则表达式索引位于结尾处匹配
  • | - 或
  • \b - 字边界
  • (Dakota Ridge.*?) - 第1组:Dakota Ridge,然后任意0个字符(除了换行符之外)尽可能少,p到第一个
  • \b - 字边界。
相关问题