正则表达式替换在 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 的正则表达式中不起作用? [复制]