【问题标题】:Get html or text from inside quotes including escape quotes with RegEx使用 RegEx 从引号内获取 html 或文本,包括转义引号
【发布时间】:2023-03-06 00:07:01
【问题描述】:

我想做的是从我正在解析的简单文本中获取属性值。我希望能够在引号内包含 HTML,所以这就是让我现在停滞不前的原因。

$line = 'attribute = "<p class=\"qwerty\">Hello World</p>" attribute2 = "value2"'



我已经到了获取值的点(子字符串)

$line = '"<p class=\"qwerty\">Hello World</p>" attribute2 = "value2"'

如果文本中没有转义引号,我当前的正则表达式可以工作。但是,当我尝试转义 HTML 引号时,它根本不起作用。此外,使用 .* 将结束第二个属性。

我试图从上面的字符串中获得的是

$result = '<p class=\"qwerty\">Hello World</p>'



这是我在尝试和错误正则表达式方面所取得的进展。

$value_regex = "/^\"(.+?)\"/"

if (preg_match($value_regex, $line, $matches)) 
     $result = $matches[1];

非常感谢您!

【问题讨论】:

  • 为什么不直接使用 HTML 解析器来完成这项任务
  • 我目前正在学习如何在 php 中创建词法分析器和解析器。这是我目前正在学习的东西,如果能得到任何帮助,我将不胜感激。

标签: php regex parsing lexer


【解决方案1】:

您可以使用否定的lookbehind 来避免匹配转义的引号:

(?<!\\)"(.+?)(?<!\\)"

RegEx Demo

这里的(?&lt;!\\)消极的后视,这将避免匹配\"

不过,我会提醒您使用正则表达式解析 HTML,最好使用 DOM。


PHP 代码:

$value_regex = '~(?<!\\\\)"(.+?)(?<!\\\\)"~';
if (preg_match($value_regex, $line, $matches)) 
     $result = $matches[1];

【讨论】:

  • 您能否更新您的答案以将正则表达式设置为变量?我遇到了一个错误,我想我可能以错误的方式逃脱了。谢谢!
  • 太棒了!非常感谢您的帮助!
  • 此解决方案无法可靠运行。如果字符串中的最后一个字符是转义符怎么办?例如'stuff "string\\" string'。另请注意,此问题在查看之前已被询问和回答:PHP: Regex to ignore escaped quotes within quotes
  • 对于这些情况,正则表达式为:(?&lt;!(?&lt;!\\)\\)"(.+?)(?&lt;!(?&lt;!\\)\\)",如this demo
  • @anubhava 再次感谢您!真的很高兴得到帮助!我已经设法让我的词法分析器完全正常工作! :)
猜你喜欢
  • 2015-09-06
  • 2012-05-01
  • 2022-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多