html — как использовать php для удаления текста, кроме определенных элементов

Вместо JavaScript я ищу лучший способ в PHP убрать весь другой текст или разметку изнутри <a> элемент, кроме <spans>, Родитель <a> Элемент не предоставляет имя класса или идентификатор для цели. Например:

У меня есть этот PHP:

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

Который генерирует этот HTML:

<div>
<ul>
<li><a><span>icontext</span> some more text to hide1!</a></li>
<li><a><span>icontext</span> some more text to hide1!</a></li>
<li><a><span>icontext</span> some more text to hide1!</a></li>
</ul>
</div>

Я хотел бы, чтобы конечный результат был:

<div>
<ul>
<li><a><span>icontext</span></a></li>
<li><a><span>icontext</span></a></li>
<li><a><span>icontext</span></a></li>
</ul>
</div>

Я понимаю, что логика будет что-то вроде следующего с правильным синтаксисом удаления:

if this = '<span>icontext</span>somemoretexttohide1!'
else if this = '<span>icontext</span> some more text to hide1!'
should just = '<span>icontext</span>'

0

Решение

$text = "<div>
<ul>
<li><a><span>icontext</span> some more text to hide1!</a></li>
<li><a><span>icontext</span> some more text to hide1!</a></li>
<li><a><span>icontext</span> some more text to hide1!</a></li>
</ul>
</div>
";

$start = 0;
while ( strpos( $text, "</span>", $start ) <> FALSE ) {
$start = strpos( $text, "</span>", $start );
$length = strpos( $text, "</a>", $start ) - $start;
$remove = substr( $text, $start, $length );
$text = str_replace( $remove, "", $text );
++$start;
}
1

Другие решения

Основываясь на направлении от @ ben-shoval, один из результатов в итоге оказался таким. Работает отлично! Если у кого-то есть какие-либо дополнительные предложения по улучшению производительности или более чистому способу, примите их и проголосуйте.

<?php if ( has_nav_menu( 'social-menu' ) ) {

// get the actual output of the html, but don't print it just yet.
$menu = wp_nav_menu( array( 'theme_location' => 'social-menu', 'fallback_cb' => '', 'echo' => false ) );

// start removing all text except what's inside the spans.
$start = 0;
while ( strpos( $menu, "</span>", $start ) <> FALSE ) {
$start = strpos( $menu, "</span>", $start )+7;
$length = strpos( $menu, "</a>", $start ) - $start;
$remove = substr( $menu, $start, $length );
$menu = str_replace( $remove, "", $menu );
++$start;
}

// now that it's modified let this HTML print to screen.
echo $menu;
}
?>
0

По вопросам рекламы [email protected]