【问题标题】:RegEx replace not working in PHP正则表达式替换在 PHP 中不起作用
【发布时间】:2015-07-14 08:30:02
【问题描述】:

我编写了一个正则表达式来从数据库 clob 中获取前两段,该数据库 clob 以 HTML 格式存储其内容。

我已经检查了这些在线 RegEx 构建器/检查器 herehere 并且他们似乎都在做我希望他们做的事情(我已经稍微改变了 RegEx,因为这些检查器可以处理新行我后来找到的格式。

但是,当我在我的 PHP 中使用它时,它似乎不想只获得我所追求的组,而是匹配所有内容。

这是我的preg_replace 线路:

$description = preg_replace('/(^.*?)((<p[^>]*>.*?<\/p>\s*){2})(.*)/', "$2", $description);

这是我得到的内容格式的测试内容

<p> 
    Paragraph 1</p> 
<p> 
    Paragraph 2</p> 
<p> 
    Paragraph 3</p>

我查看了this SO Post,但没有帮助。

有什么想法吗?

编辑

正如其中一个 cmets 所指出的,您不能在 PHP 中使用 Regex HTML(不知道为什么,我并没有对此感到困扰)。

现在我也打开了在 PL/SQL 中获取它的选项。

select 
    DBMS_LOB.substr(description, 32000, 1) /* How do I make this into a regular expression? */
from
    blog_posts

【问题讨论】:

  • 关于这个问题的另一篇 SO 帖子非常有名,这个:stackoverflow.com/q/1732348/521598
  • 为什么 DOM 解析器不适合你?不应该使用正则表达式来处理 HTML。
  • 我只想从数据库中的 CLOB 中获取前 2 段,但我不想更改该 CLOB,因为以下页面将包含所有内容,它用于博客发布预览。文本以纯 HTML 的形式返回,我认为这应该在将其加载到页面之前完成。
  • @ZachRoss-Clyne 我不会说 ;) php,但正则表达式不是 JavaScript 和 php 的混合体吗?开头和结尾的/不应该去掉吗?或者如果 JS 和 php 工作方式相同,则 ' 应该被删除。
  • 奇怪的 PHP 正则表达式在 's 和 /s 中

标签: php regex plsql


【解决方案1】:

您的输入包含换行符,因此您必须添加 s 修饰符:

/(^.*?)((<p[^>]*>.*?<\/p>\s*){2})(.*)/s

否则,.* 在换行符处换行,正则表达式不匹配。

【讨论】:

    【解决方案2】:

    您可以查看PHP Simple DOM Parser。通过他们的manual,你可以这样做:

    $html = str_get_html('your html string');
    foreach($html->find('p') as $element)   //This should get all the paragraph elements in your string.
           echo $element->plaintext. '<br>';
    

    【讨论】:

    • 很酷,我已将其更改为在 PL/SQL Select 语句中执行正则表达式,而不是按照@mishu 所说的在 PHP 中执行正则表达式
    • @ZachRoss-Clyne:仍然不建议您通过使用正则表达式来处理 HTML,无论在哪个级别完成。
    • 我不完全明白为什么。如果我需要以 HTML 格式格式化的字符串的前 2 段,则没有其他方法可以做到这一点。我尝试过简单地阅读文本,但这不起作用,因为如果我在读到一半时读到一半,那么我就会留下一个破损的页面。
    • 改变了我的路线来使用这个,看起来很受人尊敬。
    • @ZachRoss-Clyne:要理解这一点,您需要查看答案下的第一条评论。 HTML 不是一种常规语言,它没有严格的格式,可能会丢失一些东西,但 HTML 仍然会呈现。虽然您可以创建一个解析 HTML 段的表达式,但它不够健壮,如果稍有不同,很可能会中断,但仍然使用有效的 HTML。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2013-11-03
    • 2014-03-29
    相关资源
    最近更新 更多