preg_replace wp 菜单项

preg_replace wp menu item

需要一些关于 preg_replace inside wordpress 的帮助。

我的源码是这样的

<li id="menu-item-98" class="navigation-heading menu-item menu-item-type-custom menu-item-object-custom menu-item-98">
    <a href="#">Main</a>
</li>

通过使用 preg_replace,每当 li 标签具有 navigation-heading class 时,我想将其更改为下面的 html 标记.

<div class="navigation-heading">
<span>
    <span><a href="#">Main</a></span>
</span>
</div>

如果有人能帮我解决下面的代码,我将不胜感激。

function add_nav_class($output) {
    $output= preg_replace('...', '...', $output, 1);
    return $output;
}
add_filter('wp_nav_menu', 'add_nav_class');

编辑:

这是我的整个菜单(菜单 ID 在 Wordpress 中可能会有所不同)。

    <ul>
<li class="vendor-dashboard menu-item menu-item-type-custom menu-item-object-custom menu-item-22"><a href="#link">Menu Title</a></li>
<li class="navigation-heading menu-item menu-item-type-custom menu-item-object-custom menu-item-99"><a href="#">WP Heading 1</a></li>
<li class="vendor-dashboard menu-item menu-item-type-custom menu-item-object-custom menu-item-26"><a href="#link">Menu Title</a></li>
<li class="vendor-dashboard menu-item menu-item-type-custom menu-item-object-custom menu-item-16"><a href="#link">Menu Title</a></li>
<li class="navigation-heading menu-item menu-item-type-custom menu-item-object-custom menu-item-44"><a href="#">WP Heading 2</a></li>
</ul>

只有带navigation-heading class的应该改成<div class="navigation-heading">...</div>

当我使用你的代码时,菜单消失了,只有 <div class="navigation-heading">...</div> 还在。

我的最终目标是创建这个:

<ul>
<div class="navigation-heading"><span><span><a href="#">Heading</a></span></span></div>
<li id="menu-item-56" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-56">
<div class="navigation-heading"><span><span><a href="#">Heading</a></span></span></div>
<li id="menu-item-79" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-79">
<li id="menu-item-80" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-80">
</ul>

从原来的菜单中,我可以轻松删除 li ID's(感谢您分享的网站 url)。

function new_submenu_class($menu) { 
    $menu = preg_replace('/id=\"(.*?)\"/', '', $menu );     
    return $menu;  
}
add_filter('wp_nav_menu','new_submenu_class'); 

但从现在开始我被困住了。



解决方案:(感谢 Quixrick

 function change_link_to_heading($menu) {

    $str = '/<li.*?navigation-heading.*?>\s*<a href=\"#\">\s*(.*?)\s*<\/a><\/li>/m';
    $replace = '<div class="navigation-heading"><span><span></span></span></div>';

    $menu = preg_replace($str, $replace, $menu );   

    return $menu;  
}
add_filter('wp_nav_menu','change_link_to_heading'); 

我建议使用 Walker_Nav_Menu class 更改菜单元素周围的 html 标签。

Check this link with example

Source of Walker_Nav_Menu class

这看起来相对简单,可能根本不需要复杂。基本上,您可以捕获 <li> 标签内的所有内容,然后将其插入替换字符串。

最简单的形式就是这样:

<li.*?>(.*?)</li>

但如果是我,我可能会通过在捕获组前后添加 \s* 来删除匹配项周围的多余空格。

<li.*?>\s*(.*?)\s*</li>

好吧,无论如何,一旦你捕获了匹配项,你就可以像这样填写 </code> 周围的文本:</p> <pre><code><div class="navigation-heading">\n<span>\n <span></span>\n</span>\n</div>

这应该就是您需要的全部内容了。

Here is a demo of the REGEX

Here is a demo of it in PHP