正则表达式替换在 PHP 中不起作用

Posted

技术标签:

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

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

我已经检查了这些在线 RegEx 构建器/检查器 here 和 here 并且他们似乎都在做我希望他们做的事情(我已经稍微改变了 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 帖子非常有名,这个:***.com/q/1732348/521598 为什么 DOM 解析器不适合你?不应该使用正则表达式来处理 HTML。 我只想从数据库中的 CLOB 中获取前 2 段,但我不想更改该 CLOB,因为以下页面将包含所有内容,它用于博客发布预览。文本以纯 HTML 的形式返回,我认为这应该在将其加载到页面之前完成。 @ZachRoss-Clyne 我不会说 ;) php,但正则表达式不是 javascript 和 php 的混合体吗?开头和结尾的/不应该去掉吗?或者如果 JS 和 php 工作方式相同,则 ' 应该被删除。 奇怪的 PHP 正则表达式在 's 和 /s 中 【参考方案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。

以上是关于正则表达式替换在 PHP 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

包含正则表达式分隔符的简单且经过测试的在线正则表达式在 C# 代码中不起作用

包含regex分隔符的简单且经过测试的在线regex在C#代码中不起作用

为啥 `\d` 在 sed 的正则表达式中不起作用? [复制]

Javascript 正则表达式(负)后视在 Firefox 中不起作用

工作正则表达式在 laravel 验证中不起作用

我的正则表达式在 C# 中不起作用