【问题标题】:Need regex to extrude class values需要正则表达式来挤出类值
【发布时间】:2014-12-03 16:21:12
【问题描述】:

我有这种代码

<div class="test"><a href="../toto"><i class="test toto">toto</i></a></div>
<div class="test"><a href="../titi"><i class="test titi">titi</i></a></div>
<div class="test"><a href="../tutu"><i class="test tutu">tutu</i></a></div>

请注意,类的内容是未知的,但我希望最后有一个数组,在这种情况下包含:

["test toto", "test titi", "test tutu"]

【问题讨论】:

  • 所以您特别想要&lt;i&gt; 元素类,而不是 &lt;div&gt; 类,对吧?
  • PHP 还是 Javascript?你在标签中提到了这两个。

标签: php jquery regex


【解决方案1】:

试试

var j = $.map($("[class]"), function(val, key) {
  return $(val).find("[class]").attr("class")
});

var j = $.map($("[class]"), function(val, key) {
  return $(val).find("[class]").attr("class")
});
$("body").append(JSON.stringify(j, null, 4))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="test"><a href="../toto"><i class="test toto">toto</i></a></div>
<div class="test"><a href="../titi"><i class="test titi">titi</i></a></div>
<div class="test"><a href="../tutu"><i class="test tutu">tutu</i></a></div>

【讨论】:

    【解决方案2】:

    使用 PHP 的更好方法是使用 XPath:

    $dom = new DOMDocument();
    @$dom->loadHTML($yourhtml);
    
    $xpath = new DOMXPath($dom);
    
    $textNodeList = $xpath->query('//div[@class="test"]/a/i/@class');
    
    foreach ($textNodeList as $textNode) {
        echo "\n" . $textNode->nodeValue;
    }
    

    注意:正如 Niet the Dark Absol 所注意到的,如果 div 标签有多个类,你可以用 contains() 替换相等性,所以:

    $textNodeList = $xpath->query('//div[contains(@class,"test")]/a/i/@class');
    

    【讨论】:

    • 我建议[contains(@class,'test')] 改进对容器上多个类的支持。
    • @NiettheDarkAbsol:我会添加一个关于的注释。
    【解决方案3】:

    您可以通过mapget 来实现

    var arr = $('.test > a > i').map(function(){
        return this.className;
    }).get();
    console.log(arr);
    

    【讨论】:

    • 不正确。选择器与 &lt;i&gt; 元素不匹配,因为它们是 .test &gt; a &gt; i,而不是 .test &gt; i ;)
    • @NiettheDarkAbsol 啊!是的。谢谢。
    【解决方案4】:

    试试这个正则表达式:

    <i.+?class="(.+)"
    

    javaScript 代码:

    var re = /<i.+?class="(.+)"/g;
    var str = '<div class="test"><a href="../toto"><i class="test toto">toto</i></a></div>\n<div class="test"><a href="../titi"><i class="test titi">titi</i></a></div>\n<div class="test"><a href="../tutu"><i class="test tutu">tutu</i></a></div>';
    var m;
    
    while ((m = re.exec(str)) != null) {
    if (m.index === re.lastIndex) {
    re.lastIndex++;
    }
    // View your result using the m-variable.
    // eg m[0] etc.
    }
    
    【解决方案5】:

    使用 jQuery map()

    var arr = [];
    $('.test a i').map(function(){
        arr.push(this.className);
    });
    console.log(arr);
    

    使用 PHP 正则表达式

    $pattern = '/<i class="test(.*)(">)/';
    preg_match_all($pattern, $html, $m);
    $arr = array_map(function($v){
        return "test " . $v;
    }, $m[1]);
    
    print '<pre>';
    print_r($arr);
    print '</pre>';
    

    Regex Demo

    【讨论】:

    • 你复制了@Amit Joki 的答案。
    • @Scott Erm,不是吗? Amit 的回答正确地使用了.map,而这个没有:p 所以如果它一个副本,那就是一个糟糕的副本。
    猜你喜欢
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2016-01-17
    相关资源
    最近更新 更多