【问题标题】:Regex to find the string that starts with capital letter and is without "<" sign正则表达式查找以大写字母开头且没有“<”符号的字符串
【发布时间】:2013-01-08 22:30:24
【问题描述】:

我正在尝试解析以下代码:

<td class='postac'>Actelsar </td>
<td class='postac'>tabl. 80 mg 28 tabl.</td>

输入应该是“&lt;td class='postac'&gt; &lt;/td&gt;”标签之间的文本(不带“

正则表达式:/&lt;td class=\'postac\'&gt;^[A-Z]+([^&lt;]*)$&lt;\/td&gt;/s

上面的代码不起作用。谢谢你的帮助。

【问题讨论】:

  • @Havelock:在这种特殊情况下,为什么更喜欢 XPath 而不是正则表达式?
  • 尝试用正则表达式解析 HTML 是不好的。请参阅 Havelocks 评论 stackoverflow.com/questions/1732348/… 这不是关于“特定案例”,而是关于尝试它的整个想法。
  • @KingCrunch:这不是 HTML 解析,而是检查任意字符串是否匹配任意格式。使用正则表达式检查昵称是否符合某种模式并没有什么不同
  • 在非常规语言(例如 HTML、XML、任何编程语言)上使用正则表达式对于一次性命令行 hack 来说是可以的。对于任何期望重复工作的东西,请使用适当的解析器。

标签: php regex html-parsing


【解决方案1】:

上面的代码不起作用

这不是因为出于某种原因,您在正则表达式的中间放置了 $^ 符号(相应地表示字符串/行的结尾和开头)

这应该做你想做的:

/<td class=\'postac\'>([A-Z][^<]*)<\/td>/s

【讨论】:

  • 关于微优化的老问题:[A-Z] 不是更高效,而是[A-Z]+?解析器可以在大写字母之后停下来寻找大写字母,然后继续处理其他字母。好吧,在写作时我意识到,最坏的情况是一个错误的测试......没什么说的:)
【解决方案2】:

使用 HTML 解析器来解析 HTML 而不是正则表达式。用DOMDocument和DOMXPath就可以轻松搞定。

$doc = new DOMDocument();
$doc->loadHTML($str);
$xpath = new DOMXPath($doc);
$nodes = $xpath->query('//td[@class="postac"]');
$result = array();
for($i=0;$i<$nodes->length; $i++){
    $text = $nodes->item($i)->textContent;
    if(isset($text[0])&&ctype_upper($text[0])) $result[]= $text;
}

请参阅code in action

【讨论】:

  • 这很好,直到他得到 &lt;td class="postac"&gt;&lt;td class= 'postac'&gt;&lt;td class='postac' &gt;&lt;td class='postac' id='foo'&gt;&lt;td class='postac'&gt; 后跟在名称开始前的换行符,或者....
  • 是的,我知道。我实际上是在更改我的代码。见更新。它改变了。
  • 您的代码比使用正则表达式的代码长 5 倍,甚至不检查问题中的要求(关于大写字母)
  • @zerkms 但它处理一切都非常好,并且需要很短的时间来编写它。
  • @kevin cline:答案被称为“正确”的标准是什么?
【解决方案3】:

/&lt;td class=\'postac\'&gt;([A-Z]+.*)&lt;\/td&gt;/ 将匹配 Actelsar,但不匹配表。 80 毫克片剂。

【讨论】:

  • 可能值得注意:它还将匹配来自&lt;td class='postac'&gt;Actelsar &lt;/td&gt;&lt;td class='postac'&gt;tabl. 80 mg 28 tabl.&lt;/td&gt;Actelsar &lt;/td&gt;&lt;td class='postac'&gt;tabl. 80 mg 28 tabl.
  • Righto,正在用输入中的多行在 Rubular 上进行测试。 &lt;td class=\'postac\'&gt;([A-Z]+[^&gt;]*)&lt;\/td&gt; 是一种更好的解决方案,可以在一行中处理多个元素。
猜你喜欢
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多