【问题标题】:PHP RegEx Conditional returning falsePHP RegEx 条件返回 false
【发布时间】: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>

这是我写的正则表达式:(&lt;p&gt;&lt;)?(?(1)&lt;\/div&gt;|&gt;)(\w)

现在,我的 RegEx 的第一个匹配组查找 &lt;p&gt;&lt;,因为这就是我确定第一段之前是否有图像的方式。奇怪的是,即使 (&lt;p&gt;&lt;) 本身匹配,条件返回 false。

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

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

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

【问题讨论】:

  • 这可能看起来很极端,但 HTML 可能很极端。如果你的&lt;p&gt; 变成&lt;p class="whatever"&gt; 怎么办?或者&lt;div&gt; 标签跨越多行?这么多人说“使用 HTML 解析器”的原因是因为我们以前也曾走这条路,遇到过同样的麻烦。
  • 这个正则表达式应该给你文本的第一个字母,无论是否有一个附件 &lt;div&gt; 介于两者之间:(&lt;\/p&gt;&lt;\/div&gt;(\w))|(&lt;p&gt;(\w)) 但是一旦 HTML 是这样的解决方案往往会失败改变了一点。
  • @AndyLester 谢谢,我想这就是我们最终要做的。
  • @z80crew 请作为答案发布,以便我接受。
  • @z80crew 此外,您的正则表达式可以写成(&lt;\/p&gt;&lt;\/div&gt;|&lt;p&gt;)(\w) 以避免尽可能多的捕获组,但感谢您指出我不必使用条件我只需要一个 OR。

标签: php regex html-parsing


【解决方案1】:

此正则表达式应为您提供文本的第一个字母,无论其间是否有附件 &lt;div&gt;

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

它匹配&lt;/p&gt;&lt;/div&gt; 序列后的第一个字母或打开&lt;p&gt; 标记后的第一个字母。但是,一旦对 HTML 进行了一点更改,这种解决方案就会惨遭失败。因此,向&lt;p&gt; 标签添加一个类或一个id,正则表达式将停止匹配。对于稳定的解决方案,HTML 解析器将是更好的选择。

【讨论】:

    【解决方案2】:

    将 HTML 用于看似简单的任务可能看起来很极端,但 HTML 可能很极端。如果你的&lt;p&gt; 变成&lt;p class="whatever"&gt; 怎么办?或者&lt;div&gt; 标签跨越多行?之所以这么多人说“使用 HTML 解析器”,是因为我们之前也曾走这条路,遇到过同样的麻烦。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这只是整个 HTML 的一小部分。
      • 看代码...在第一行,第二个p在第一个p被关闭之前打开...如果U关闭第一个p,正则表达式会很容易。
      猜你喜欢
      • 2015-07-28
      • 2022-11-10
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 2018-10-30
      • 2011-09-10
      相关资源
      最近更新 更多