PHP RegEx条件返回false

时间:2014-06-04 15:52:11

标签: php regex html-parsing

我正在尝试编写一个RegEx来解析一小段HTML,以便在dropcap范围内包装一个stort的第一个字母。问题是,有时候我们的作家会在故事的第一个字母之前放置图像(向右浮动)。我以为我可以编写一个带有条件的RegEx来检查额外的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>

以下是我写的RegEx:(<p><)?(?(1)<\/div>|>)(\w)

现在,我的RegEx的第一个匹配组会查找<p><,因为这就是我如何判断第一段之前是否有图像。奇怪的是,即使(<p><)本身匹配,条件也会返回false。

测试:http://regex101.com/r/vS5cM0

预期输出为S,但它匹配第一段(A)的第一个字母(意味着条件返回false。

我理解XML解析器是正确的做法,但是找到一个字母并将其包装在div中似乎是极端的。

3 个答案:

答案 0 :(得分:1)

这个正则表达式应该为您提供文字的第一个字母,无论是否有中间的附件<div>

(<\/p><\/div>(\w))|(<p>(\w))

它匹配</p></div>序列后面的第一个字母或打开<p>标记后的第一个字母。但是一旦HTML稍微改变,这样的解决方案往往会失败。因此,在<p>标记中添加一个类或ID,正则表达式将停止匹配。对于稳定的解决方案,HTML解析器将是更好的方法。

答案 1 :(得分:1)

将HTML用于看似简单的任务似乎是极端的,但HTML可能是极端的。如果您的<p>成为<p class="whatever">怎么办?或者<div>标记跨越多行?很多人说“使用HTML解析器”的原因是因为我们之前一直走在这条路上并遇到了你将遇到的同样麻烦。

答案 2 :(得分:0)

第一个p元素是一个未闭合的元素。 这是一个无效的HTML代码。不久你必须解决这个问题......也许,一切正常。