【问题标题】:Using PHP to remove an element if it contains a string in its inner text如果元素的内部文本中包含字符串,则使用 PHP 删除该元素
【发布时间】: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


【解决方案1】:

你可以这样做

$str = '<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>';

$get_only_span    = str_replace(array("<div>","</div>"),'',$str);
$explode_to_array = explode("<span",$get_only_span);
$filter           = array_filter(array_map('trim', $explode_to_array));

$new_span = '<div>';
foreach($filter as $key){
     if (strpos($key, 'pic.example.com') == false) {
        $new_span .= '<span'.$key;
     }
}
$new_span .= '</div>';

print_r($new_span);


/*
 <div>
  <span class="all-the-same-classes">example text</span> 
  <span class="all-the-same-classes">example text</span>
 </div>
*/

Online Test

【讨论】:

  • 你能看看最新的编辑,看看你能不能成功地使用这个方法吗?
  • 我的回答是基于你的第一个问题,我会检查你的编辑
  • 欣赏!
  • 嘿 Younes,你有机会看过这个 sn-p 吗?我仍然无法让它工作!
  • 嗨,你能在这里展示一下返回的内容吗 foreach($articletext->find('span') as $articlespan) { print_r($articlespan);
【解决方案2】:

我已经设法使用这种格式实现了我想要的:

foreach($article->find('.article-text') as $articletext) :
    foreach($articletext->find('a') as $articletextanchors) :
        if (strpos($articletextanchors, 'pic.twitter.com') !== false) :
            $removethislink = $articletextanchors;
        endif;
    endforeach;
    $articletext = str_ireplace($removethislink, '', $articletext);
endforeach;

代码遍历文章文本中的链接,查找字符串,创建一个等于完整锚点的变量,然后将其从文章文本中删除。

【讨论】:

    猜你喜欢
    • 2018-05-05
    • 1970-01-01
    • 2020-06-17
    • 2016-04-09
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多