将标题属性值移动到HTML代码中的类属性值

时间:2010-10-24 08:42:18

标签: php html regex

我们的变量$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>

我想做什么:

  1. 获取每个链接title=""的值,并将其移至父<li>类的末尾。

  2. 从每个链接中删除title=""

  3. 变量$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>
    

    解决方案是什么?

4 个答案:

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