Search code examples
phpstrposstring-lengthstrip-tags

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


Trying to remove text from between </span> and </a>. I want to just remove the some text here just after the </span> so that it only shows the icon.

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

What currently echoes:

<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>

What should echo:

<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>

Using this below code in WordPress the text after the span is still present. It won't strip out the text after the </span>. What's my mistake? here:

<?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=\"$1\"><span></span></a>", $menu);
    }

    echo $menu;
    }
?>

enter image description here


Solution

  • Why don't you just solve that with a regex?

    function convertURL($url) {
      return preg_replace("/<a href=\"([^\"]+?)\">.*/", "<a href=\"$1\"><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>
    

    EDIT:
    test.php:

    <?php
    function convertURL($url) {
      return preg_replace("/<a href=\"([^\"]+?)\">.*/", "<a href=\"$1\"><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>