【发布时间】:2014-06-04 15:52:10
【问题描述】:
我正在尝试编写一个正则表达式来解析一小段 HTML,以便将 stort 的第一个字母包装在 dropcap 跨度中。问题是,有时我们的作者会在故事的第一个字母之前放置图像(它们是向右浮动的)。我认为我可以编写一个带有条件的正则表达式来检查额外的 div,并更改它搜索的内容。
这就是事情变得奇怪的地方。
这是我正在测试的文本(有图片):
<p><div id="attachment_28554" style="width: 415px" class="wp-caption alignright"><img class="size-full wp-image-28554 " alt="Caniff_MissMIzzou[1]" src="http://cafnrnews.com/uploads/2014/04/Caniff_MissMIzzou1.jpg" width="405" height="716" /><p class="wp-caption-text">A Milton Caniff drawing of Miss Mizzou. Courtesy the Toni Mendez Collection, The Ohio State University Billy Ireland Cartoon Library and Museum.</p></div>She was tall, blond, tough yet vulnerable, lived with her sketchy past, and was never seen without her signature trench coat. From her beginning in 1952 to her passing in 1988,</p>
<p>she was more than the pen-and-ink drawings of the other women, for she inspired calendars, airplane pin-ups, beauty contests and halftime events on the MU campus.</p>
这是我写的正则表达式:(<p><)?(?(1)<\/div>|>)(\w)
现在,我的 RegEx 的第一个匹配组查找 <p><,因为这就是我确定第一段之前是否有图像的方式。奇怪的是,即使 (<p><) 本身匹配,条件返回 false。
测试:http://regex101.com/r/vS5cM0
预期的输出是 S,但它匹配第一段的第一个字母 (A)(意味着条件返回 false。
我知道 XML 解析器是正确的做法,但是找到一个字母并将其包装在 div 中似乎很极端。
【问题讨论】:
-
这可能看起来很极端,但 HTML 可能很极端。如果你的
<p>变成<p class="whatever">怎么办?或者<div>标签跨越多行?这么多人说“使用 HTML 解析器”的原因是因为我们以前也曾走这条路,遇到过同样的麻烦。 -
这个正则表达式应该给你文本的第一个字母,无论是否有一个附件
<div>介于两者之间:(<\/p><\/div>(\w))|(<p>(\w))但是一旦 HTML 是这样的解决方案往往会失败改变了一点。 -
@AndyLester 谢谢,我想这就是我们最终要做的。
-
@z80crew 请作为答案发布,以便我接受。
-
@z80crew 此外,您的正则表达式可以写成
(<\/p><\/div>|<p>)(\w)以避免尽可能多的捕获组,但感谢您指出我不必使用条件我只需要一个 OR。
标签: php regex html-parsing