【发布时间】: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