【问题标题】:Create a Javascript RegExp to find opening tags in HTML/php template创建一个 Javascript RegExp 以在 HTML/php 模板中查找开始标签
【发布时间】:2011-12-23 16:56:46
【问题描述】:

我正在尝试编写一个 Javascript HTML/php 解析器,它将从 HTML/php 源中提取所有打开标签并返回标签类型和属性及其值,同时监控值/属性是否应该从静态文本或 php 变量进行评估。问题是当我尝试编写 Javascript RegExp 模式时,更具体地说是某些罕见的情况。我能够想出的正则表达式要么涉及负向回溯(以处理结束 php 标记 - 即匹配前面没有问号的结束括号),要么在某些情况下失败。后视版本看起来像:

<[a-zA-Z]+.*?(?<!\?)>

...除了我的情况必须避免使用lookbehind之外,它工作得很好。一个对 Javascript 更友好的版本是:

<[a-zA-Z]+((.(?!</)(?!<[a-zA-Z]+))*)?>

...除了在这种情况下有效:

<option value="<?php echo $img; ?>"<?php echo ($hpb[$i]['image_filename']==$img?' selected="selected"':''); ?>><?php echo $img; ?></option>

我是在处理问题时完全搞砸了,还是在我的情况下真的需要后视?非常感谢任何帮助。

【问题讨论】:

  • 嗯...也许我不应该在问题中添加(解析)标签。我正在开发的工具与真正的解析器并不接近。它更像是一个文本处理工具,它吃开始标签或有时带有开始标签、innerHTML 和结束标签的简单 HTML 元素。没什么复杂的——没有嵌套标签,没有糟糕的代码。我是编写模板的人,我将提供给它,所以我要求的是一个简单的 javascript 正则表达式,它将匹配 HTML 元素中的开始标记并将其分解为普通属性和涉及 PHP 的属性代码。
  • 或者为了让事情变得更简单,我计划针对该模式测试的 HTML 将只是开始标记部分。出于好奇,我想知道我是否采用像 foo 这样的简单元素并针对模式对其进行测试,我是否可以只使用开始标记,以确保它不会以结束 PHP 标记结束结束 HTML 括号。
  • 带有 DOM 的 JavaScript 已经提供了一种解析 HTML 的方法。为什么不使用它?
  • 浏览器解析器可能会阻塞 php.ini 文件。您可以将 php 代码替换为 html-entities 或其他内容,然后再将其提供给浏览器解析器,然后再解码实体。另请注意,浏览器有时会修改 DOM,例如自动创建关闭元素,或在不存在时创建 tbody 元素。

标签: javascript regex parsing


【解决方案1】:

更简单的答案是 ]+>

【讨论】:

  • 这应该是答案。
  • 我们可以通过省略第二个抑扬符&lt;[^/&gt;]+&gt;来节省另一个字节。我错了吗?
  • ]+> 也匹配,例如,'' 和 '你如何处理这个问题。你知道 2 2 也应该返回 True。但是 2 > 3 总是 False。” (来自 Udacity 课程“计算机程序设计”的字符串)
  • 这不适用于锚点,其中字符“/”可能出现在链接中
【解决方案2】:

只需确保 '>' 之前的最后一个字母不是 ?,使用 [^?]。无需前瞻或后瞻。

<[a-zA-Z](.*?[^?])?>

括号和最后一个?还可以匹配&lt;b&gt; 之类的标签。

EDIT 该解决方案不适用于没有属性的单字符标签。所以这里有一个:

<[a-zA-Z]+(>|.*?[^?]>)

【讨论】:

猜你喜欢
相关资源
最近更新 更多
热门标签