php preg_replace 没有结果和错误但没有错误消息

php preg_replace no result and error but not error message

当 运行 以下代码时,我的 php 脚本不是 运行 并且不显示错误消息。

<?php
    $content = '<p>Hi </p> <p>The post <a rel="nofollow" href="http://sample.com/article/2016/09/05/%d8%a7%d9%84-%d8%ac%db%8c-%d9%82%d8%b5%d8%af-%d8%af%d8%a7%d8%b1%d8%af-%d8%b3%d8%b1%d9%85%d8%a7%db%8c%d9%87-%da%af%d8%b0%d8%a7%d8%b1%db%8c-%d8%b9%d8%b8%db%8c%d9%85%db%8c-%d8%b1%d8%a7-%d8%af%d8%b1/" ><b>ال جی قصد دارد سرمایه گذاری عظیمی را در حوزه رباتیک انجام دهد</b></a> appeared first on <a rel="nofollow" href="http://sample.com" ><b>بهنام</b></a>.</p>';
    $content = preg_replace('/(The post)+(.)+(appeared first)+(.)+(\.)*/i', '', $content);
    echo $content;

我想删除 "The post" 中的所有内容,直到内容变量字符串的结束点。

我的目标是动态移除

The post <a rel="nofollow" href=""><b>ال جی قصد دارد سرمایه گذاری عظیمی را در حوزه رباتیک انجام دهد</b></a> appeared first on <a rel="nofollow" href="http://sample.com" ><b>بهنام</b></a>. 

从内容结尾(RSS 描述)。

我认为这个问题是因为 $content 的值是 unicode(persian)。

当从内容变量中删除 link 的 href 输出为真。

请检查此方法是否适合您。

$content = preg_replace('|<p>The post(.)*|', '', $content);

我的第一个解决方案:

$contentToReplace[] = '/The post/';
$contentToReplace[] = '/appeared first on/';

$content = preg_replace($contentToReplace, '', $content);

请尝试

$content = '<p>Hi </p> <p>The post <a rel="nofollow" href=""><b>ال جی قصد دارد سرمایه گذاری عظیمی را در حوزه رباتیک انجام دهد</b></a> appeared first on <a rel="nofollow" href="http://sample.com" ><b>بهنام</b></a>.</p>';
$result = preg_replace(
          array('/The post/', '/appeared first on/'),
          array('', ''),
          $content
);
echo $result;

$content = preg_replace('/The post(.)*/i', '', $content);

满足你的需求。 . 意味着除换行符之外的所有内容,因此您不需要所有这些额外的绒毛。

使用更优越的DOM方法:

<?php

$data = <<<DATA
<p>Hi </p> <p>The post <a rel="nofollow" href="http://sample.com/article/2016/09/05/%d8%a7%d9%84-%d8%ac%db%8c-%d9%82%d8%b5%d8%af-%d8%af%d8%a7%d8%b1%d8%af-%d8%b3%d8%b1%d9%85%d8%a7%db%8c%d9%87-%da%af%d8%b0%d8%a7%d8%b1%db%8c-%d8%b9%d8%b8%db%8c%d9%85%db%8c-%d8%b1%d8%a7-%d8%af%d8%b1/" ><b>ال جی قصد دارد سرمایه گذاری عظیمی را در حوزه رباتیک انجام دهد</b></a> appeared first on <a rel="nofollow" href="http://sample.com" ><b>بهنام</b></a>.</p>
DATA;

$dom = new DOMDOcument();
$dom->loadHTML($data, LIBXML_HTML_NOIMPLIED); 
$dom->removeChild($dom->doctype);

$xpath = new DOMXPath($dom);

$elements_to_be_removed = $xpath->query("//p[starts-with(text(), 'The post ')]");
foreach ($elements_to_be_removed as $element) {
    $element->parentNode->removeChild($element);
}

// just to check
echo $dom->saveHTML();
# <p>Hi </p>
?>

这将删除文本以 "The post " 开头的每个 p

正确的答案是:

$content = preg_replace('/The post.+appeared first on.+\./ui', '', $content);

感谢 wiktor-stribiżew