2016-11-21 81 views
0

尝试从</span></a>之间删除文本。我想只是在</span>之后删除some text here,以便它只显示图标。删除<a></a>之间的文本但不是href或<span></span>使用PHP

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

    echo $menu; 
    } 
?> 

enter image description here

回答

2

你为什么不只是解决一个正则表达式中删除的东西?

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> 

编辑:
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> 
+0

我最终走了这条路。更简单,更清洁。我更新了正则表达式来解释超过1个URL集。我会用最终结果更新我的代码。 – JonnyBorg

+0

我在我的问题中添加了一段代码,尝试合并您的功能。这种方法对我来说最合适,而且是一种更清洁的方法。但显然我没有正确实施。思考? – JonnyBorg

+0

@JonnyBorg尝试从正则表达式中去除'?'。因此,它是'。*?<\/a>' – PKeidel

1

强制性https://stackoverflow.com/a/1732454/2191572但这应该工作。

如果我可以重新字你的要求,然后要在</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; 
+0

正确的。这正是我所追求的,但由于某种原因,href也被剥离了。 – JonnyBorg

+0

@JonnyBorg甚至使用我的解决方案? – MonkeyZeus

+0

@JonnyBorg你可以用你试图解析的'$ bad_string'来更新你的问题吗?确保指出是否有换行符\ n或任何东西,因为如果你有多个URL,那么必须执行额外的预处理 – MonkeyZeus