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
当 运行 以下代码时,我的 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