使用 PHP 删除 <a></a> 之间的文本,但不删除 href 或 <span></span> 之间的文本

Remove Text between <a></a> but not the href or <span></span> using PHP

正在尝试删除 </span></a> 之间的文本。我只想删除 </span> 之后的 some text here,这样它只显示图标。

$bad_string = '<li class="someclasses"><a target="_blank" href="http:www.example.com/dir/handle"><span></span>some text here</a></li>';

$good_string = '<li class="someclasses"><a target="_blank" href="http:www.example.com/dir/handle"><span></span></a></li>';

当前回显的内容:

<ul id="menu-social-menu-1" class="menu">
    <li class="someclasses"><a target="_blank" href="http:www.example.com/dir/handle"><span></span>some text here</a></li>
    <li class="someclasses"><a target="_blank" href="http:www.example.com/dir/handle"><span></span>some text here</a></li>
    <li class="someclasses"><a target="_blank" href="http:www.example.com/dir/handle"><span></span>some text here</a></li>
    <li class="someclasses"><a target="_blank" href="http:www.example.com/dir/handle"><span></span>some text here</a></li>
    <li class="someclasses"><a target="_blank" href="http:www.example.com/dir/handle"><span></span>some text here</a></li>
</ul>

应该回显什么:

<ul id="menu-social-menu-1" class="menu">
    <li class="someclasses"><a target="_blank" href="http:www.example.com/dir/handle"><span></span></a></li>
    <li class="someclasses"><a target="_blank" href="http:www.example.com/dir/handle"><span></span></a></li>
    <li class="someclasses"><a target="_blank" href="http:www.example.com/dir/handle"><span></span></a></li>
    <li class="someclasses"><a target="_blank" href="http:www.example.com/dir/handle"><span></span></a></li>
    <li class="someclasses"><a target="_blank" href="http:www.example.com/dir/handle"><span></span></a></li>
</ul>

在 WordPress 中使用以下代码,跨度后的文本仍然存在。它不会删除 </span> 之后的文本。我的错误是什么?这里:

<?php if ( has_nav_menu( 'social-menu' ) ) {
    $menu = wp_nav_menu( array( 'theme_location' => 'social-menu', 'fallback_cb' => '', 'echo' => false ) );

    function convertURL($menu) {
        return preg_replace("/<a target=\"_blank\" href=\"([^\"]+?)\"><span><\/span>.*?<\/a>/", "<a target=\"_blank\" href=\"\"><span></span></a>", $menu);
    }

    echo $menu;
    }
?>

强制性的 但这应该有效。

如果我可以重新表述您的要求,那么您想删除 </span></a>

之间的内容
$bad_string = '<a href="http:www.example.com/dir/handle"><span>social icon</span>some text here</a>';

$parts = explode('</span>', $bad_string); // explode on </span> and save the array
array_pop($parts); // remove last element of array which should be "some text here</a>"
$parts[] = '</a>'; // re-add the </a>

$good_string = implode('</span>', $parts); // re-join the array on </span>

echo $good_string;

你为什么不用正则表达式解决这个问题?

function convertURL($url) {
  return preg_replace("/<a href=\"([^\"]+?)\">.*/", "<a href=\"\"><span></span></a>", $url);
}
// input:  <a href="http:www.example.com/dir/handle"><span></span>some text here</a>
// output: <a href="http:www.example.com/dir/handle"><span></span></a>

编辑:
test.php:

<?php
function convertURL($url) {
  return preg_replace("/<a href=\"([^\"]+?)\">.*/", "<a href=\"\"><span></span></a>", $url);
}

foreach(['<a href="http://linkedin.com/some/vanity"><span></span>some text here</a>', '<a href="http:www.example.com/dir/handle"><span></span>some text here</a>'] as $url) {
  echo "$url => ";
  echo convertURL($url)."\n";
}

php test.php:

$ php /tmp/test.php
<a href="http://linkedin.com/some/vanity"><span></span>some text here</a> => <a href="http://linkedin.com/some/vanity"><span></span></a>
<a href="http:www.example.com/dir/handle"><span></span>some text here</a> => <a href="http:www.example.com/dir/handle"><span></span></a>