【发布时间】:2020-07-24 16:28:51
【问题描述】:
如果我有一个包含多个跨度的代码块,如下所示:
<div>
<span class="all-the-same-classes">example text</span>
<span class="all-the-same-classes">example text</span>
<span class="all-the-same-classes">pic.example.com/A1B2C3</span>
</div>
此代码是变量 $codeblock 下的字符串格式。
我希望使用 PHP 移除/删除最后一个 span 元素。
我想保留其他具有相同类的跨度。我也不能只针对最后一个跨度,它必须使用它的 innerhtml 来完成。 innerhtml 必须包含 pic.example.com & 后跟一个随机的字母数字字符串。
我将整个代码块作为字符串读取,我可以在其中应用 preg_replace 和 str_ireplace。
谁能帮我通过它的 innerhtml 来定位这个跨度并删除它?我一直在使用 str_ireplace、strip_tags 和 preg_replace,但无法弄清楚这种针对 innerhtml 的特殊方式。
我想为您提供一个示例,但我不知道从哪里开始。我想它会是:
// block of code as string - run a replace on it
$codeblock = preg_replace(
// if in the block of code there is a span that contains pic.example.com
if(strpos($codeblock->span->innertext, 'pic.example.com')),
// replace with blank
'',
// return new code block as itself
$codeblock);
如您所见,我还差得很远,如何将所有这些 PHP 功能组合成我需要的功能?
编辑添加完整的代码块,以便有更多上下文:
foreach($article->find('.article-text') as $articletext) {
$articletext = str_ireplace('articleTextSize articleTextSize--normal js-article-text ', '', $articletext);
$articletext = str_ireplace('data-aria-label-part="0"', '', $articletext);
$articletext = str_ireplace('lang="en" ', '', $articletext);
$articletext = str_ireplace('data-query-source="hashtag_click" ', '', $articletext);
$articletext = str_ireplace(' pretty-link js-nav" dir="ltr" ', '"', $articletext);
$articletext = preg_replace('/href=".*?"/', '', $articletext);
$articletext = str_ireplace('<a', '<span', $articletext);
$articletext = str_ireplace('</a>', '</span>', $articletext);
$articletext = strip_tags($articletext, '<div>, <p>, <span>');
$articletext = preg_replace(if(strpos($articletext->span->innertext, 'pic.example.com')),'', $articletext);
if ($articlehasimageshowing == 0) {
$articletext = str_ireplace('article-text', 'article-text article-has-bg-text ', $articletext);
} else {
$articletext = str_ireplace('article-text', 'article-text', $articletext);
}
echo $articletext;
}
编辑我已经尽力了,这就是我所能做到的(虽然它坏了,但我认为它已经接近了):
foreach($article->find('.article-text') as $articletext) :
$articletextacounter = 1;
foreach($articletext->find('a') as $articlea) : ?>
<!-- New A found! -->
<?php
echo $articlea;
$articleatext = $articlea->textContent;
echo $articleatext;
if (strpos($articleatext, 'pic.twitter.com') !== false) :
unset($articlea[$articletextacounter]);
endif;
$articletextacounter++;
endforeach;
$articletext = str_ireplace('articleTextSize articleTextSize--normal js-article-text ', '', $articletext);
$articletext = str_ireplace('data-aria-label-part="0"', '', $articletext);
$articletext = str_ireplace('lang="en" ', '', $articletext);
$articletext = str_ireplace('data-query-source="hashtag_click" ', '', $articletext);
$articletext = str_ireplace(' pretty-link js-nav" dir="ltr" ', '"', $articletext);
$articletext = preg_replace('/href=".*?"/', '', $articletext);
$articletext = str_ireplace('<a', '<span', $articletext);
$articletext = str_ireplace('</a>', '</span>', $articletext);
$articletext = strip_tags($articletext, '<div>, <p>, <span>');
if ($articlehasimageshowing == 0) {
$articletext = str_ireplace('article-text', 'article-text article-has-bg-text ', $articletext);
} else {
$articletext = str_ireplace('article-text', 'article-text', $articletext);
}
echo $articletext;
endforeach;
这个编辑可能哪里出错了?
【问题讨论】:
-
尝试使用正则表达式/字符串替换等容易出错,并且通常会导致问题,因为它不知道内容的上下文。副本应该有助于开始一些事情,如果你遇到困难回来,我相信你会得到更多帮助。
-
@NigelRen 我已经很熟悉 simple-html-dom 的使用,这就是我需要帮助的事情:s
-
@NigelRen 我添加了我的代码的更直接副本,以便您了解我在做什么
-
在创建问题时提及这一点很有帮助,我也添加了标签。
-
@NigelRen 我可以理解为什么它被关闭/已经回答。感谢您重新打开!
标签: php regex innerhtml simple-html-dom