我们的变量$menu
里面有HTML(没有循环,它来自一个函数)。
在echo
上,它会提供如下代码:
<ul id="menu">
<li id="some-id" class="many classes"><a title="one" href="#">text</a></li>
<li id="some-id" class="many classes"><a href="#">text</a></li>
<li id="some-id" class="many classes"><a title="three" href="#">text</a></li>
</ul>
我想做什么:
获取每个链接title=""
的值,并将其移至父<li>
类的末尾。
从每个链接中删除title=""
。
变量$menu
内的代码应该变为:
<ul id="menu">
<li id="some-id" class="many classes one"><a href="#">text</a></li>
<li id="some-id" class="many classes"><a href="#">text</a></li>
<li id="some-id" class="many classes three"><a href="#">text</a></li>
</ul>
解决方案是什么?
答案 0 :(得分:1)
使用此正则表达式:
(<li[^>]*class=".*)("><a).*title="(.*)"(.*)
使用反向引用替换每个匹配:
\1 \3\2\4
请注意,这适用于您的示例,但如果您遇到以下情况,则可能需要对其进行修改并使其“更智能”:
<li id="some-id >" class="many classes"><a title="one" href="#">text</a></li>
答案 1 :(得分:1)
您可以使用PHP Simple HTML DOM Parser修改HTML:
如果li
中没有修复$menu
,那么您可以使用Simple HTML DOM Parser执行此类操作:
// Include downloaded library
include 'simplehtmldom/simple_html_dom.php';
// Create DOM from string
$html = str_get_html( $menu );
for( $i=0 ; $i<3 ; $i++ ) {
// Get current classes of li
$currentClasses = $html->find('li', $i)->class;
// Get title of link
$linkTitle = $html->find('a', $i)->title;
// Add link title in li classes
$html->find('li', $i)->class = $currentClasses . ' ' . $linkTitle ;
// Remove title attribute from link
$html->find('a', $i)->title = null;
}
echo $html;
答案 2 :(得分:1)
这不是一个完美的解决方案,但它在我的测试(Regex Buddy&amp; XAMPP)中使用了您的示例代码。
$pattern = '/(<li [^>]*)(?:class=(?:"([^"]+)"|\'([^\']+)\'))([^>]*><a[^>]*)(?:title=(?:"([^"]+)"|\'([^\']+)\'))\s([^>]*>)(.*?<\/li>)/im';
$replace = '$1class="$2 $5"$4$7$8';
preg_replace( $pattern , $replace , $menu );
答案 3 :(得分:0)
与your other question相同。使用DOM:
$dom = new DOMDocument;
$dom->loadXML( $html );
$xpath = new DOMXPath( $dom );
$links = $xpath->query( '/ul/li/a[@title]' );
foreach($links as $link ) {
$classes = $link->parentNode->getAttribute( 'class' );
$classes .= ' ' . $link->getAttribute( 'title' );
$link->parentNode->setAttribute( 'class', $classes );
$link->removeAttribute( 'title' );
}
echo $dom->saveXML( $dom->documentElement );
同样,这假设您使用的是有效的XHTML。如果没有,则必须使用loadHTML
加载标记并更改XPath以将添加的HTML骨架考虑在内。请注意,这也会更改DOMDocument的documentElement
,因此您必须将菜单节点传递给saveXML
。