Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:用于在html元素中查找类的正则表达式_Php_Html_Regex - Fatal编程技术网

PHP:用于在html元素中查找类的正则表达式

PHP:用于在html元素中查找类的正则表达式,php,html,regex,Php,Html,Regex,我有一个html ul菜单,它有一个子菜单。我想用PHP将“first item”类添加到子菜单的第一项中 <ul id="menu-main" class="menu"> <li id="menu-item-68" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-68"><a href="...">ITEM1</a>

我有一个html ul菜单,它有一个子菜单。我想用PHP将“first item”类添加到子菜单的第一项中

<ul id="menu-main" class="menu">
  <li id="menu-item-68" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-68"><a href="...">ITEM1</a></li>
  <li id="menu-item-69" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-69"><a href="...">ITEM2</a>
  <ul class="sub-menu">
    <li id="menu-item-70" class="first-item menu-item menu-item-type-post_type menu-item-object-page menu-item-70"><a href="...">SUB-ITEM-1</a></li>
    <li id="menu-item-71" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-71"><a href="...">SUB-ITEM2</a></li>
  </ul>
  <li id="menu-item-73" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-73"><a href="...">ITEM3</a></li>
</ul>

你最好使用和。它们提供了导航DOM的方法。您可以使用下面这样的方法来查找子菜单(尽管我没有测试过它,所以xpath可能不完全正确)。一旦找到了感兴趣的DOM元素,就需要修改它的class属性

$dom = new DOMDocument ();
$dom -> loadHTML ($htmlString);
$path = new DOMXpath ($dom);

$firstItem = $path -> query ('//ul[@id="main-menu"]//ul[@class="sub-menu"]/li[1]');

首先,第二个
  • 缺少其关闭
    。修复该问题将允许您使用它,它使用DOMDocument/DOMXPath更改子菜单中第一个
  • 上的类:

    $doc = new DOMDocument;
    $doc->loadHTML( $html);
    
    $xpath = new DOMXPath( $doc);
    $first_node = $xpath->query( '//ul[@id="menu-main"]/ul[@class="sub-menu"]/li')->item(0);
    
    $new_class = $doc->createAttribute( "class");
    $new_class->appendChild( $doc->createTextNode( "first-item "));
    $new_class->appendChild( $doc->createTextNode( $first_node->getAttributeNode("class")->value));
    
    $first_node->setAttributeNode( $new_class);
    
    这会导致子菜单中的第一个
  • string(198)”

  • 为此使用jQuery或JavaScript

    以下是使用jQuery的一种方法:

    $('.sub-menu').find('li:first-child').addClass('first-item');
    

    为什么要用PHP来实现这一点?PHP构建HTML。这类事情通常是用JavaScript完成的??检查第二个示例-如何修改HTML Dom元素-或者-仅使用javascript?@JezenThomas:HTML不一定是输出的,即使是输出,可访问性仍然是一个有效的问题。Joudieck:使用HTML解析器和序列化程序,例如
    DOMDocument
    string(198) "<li id="menu-item-70" class="first-item menu-item menu-item-type-post_type menu-item-object-page menu-item-70"><a href="...">SUB-ITEM-1</a></li>" 
    
    $('.sub-menu').find('li:first-child').addClass('first-item');