如何获取<a> tag with one line of code?

时间:2017-04-02 07:13:45

标签: php html css substring

I have variables $e and $x:

$e="<a class="ui small interactive circular label" style="background-color:#4bbedd;vertical-align:middle;" data-reactid=".0.1.1.1.3.0.0.1.1.1.1.0.$Aquatic Blue">" 

$x="<a class="ui small interactive circular label" style="background-color:#F27EB2;vertical-align:middle;" data-reactid=".0.1.1.1.3.0.0.1.1.1.1.0.$Azalea">"

I need the string #4bbedd, not searching by "#4bbedd" in $e and #F27EB2 in $x.

Step by step: First I need to get string before the ;vertical word and that string is "<a class="ui small interactive circular label" style="background-color:#4bbedd"

Then I need to get string after the color: word and I got my value only using PHP function and only in one line of code to get from both variables

I need to change only the variable name that contain string like $e then $x, the line logic should be like this:

$var = $e.functionForFindStringBeforThisWord(";vertical").functionForFindStringAfterThisWord("color:")

or is there another way that has only one line code?

2 个答案:

答案 0 :(得分:0)

你期待这个吗?

PHP code demo

string array1 = "zl svefg gbby pelcgb";
        int t2 = 0;
        foreach (char c in array1)
        {
            if ((int)c == 32 || ((int)c >= 48 && (int)c <= 57))
                t2 = c;
            else
                t2 = ((((int)c - 97) - 13) % 26) + 97;
            Console.Write((char)t2);
        }

答案 1 :(得分:0)

最可靠,最直接的方法是使用preg_match()模式专门针对background-color:后面的值。

通过这样做,即使css属性的顺序不同,您仍将获得所需的子字符串。 Sahil的方法假设你想要第一个css属性的值 - 如果background-color不存在或者不是第一个css属性,这将产生不正确的结果。

这是一个简单的模式:/background-color:\K[^;]+/这表示查找子字符串background-color:,然后\K说“从这一点开始匹配”。 [^;]+表示匹配一个或多个不是分号的字符 - 这使得匹配在分号之前结束。

Pattern Demo

为了提高可靠性,您可以在样式属性中包含background-color:的检查:

/style="[^"]*background-color:\K[^;]+/

代码:(Demo

$strings=['<a class="ui small interactive circular label" style="background-color:#4bbedd;vertical-align:middle;" data-reactid=".0.1.1.1.3.0.0.1.1.1.1.0.$Aquatic Blue">',
'<a class="ui small interactive circular label" style="vertical-align:middle;background-color:#F27EB2;" data-reactid=".0.1.1.1.3.0.0.1.1.1.1.0.$Azalea">'
];

foreach($strings as $string){
    echo (preg_match('/style="[^"]*background-color:\K[^;]+/',$string,$out)?$out[0]:'failed'),"\n";
}

输出:

#4bbedd
#F27EB2

现在,即使这样也容易受到误报匹配的影响(但老实说,你必须刻意去做才能让它失败)。

StackOverflow的默认建议是,每当您尝试从html字符串中解析/提取值时,都应该使用DOM解析器。如果你非常担心误报匹配而不担心处理速度,你可以走那条路。

如果您希望看到另一种非正则表达式方法,这将比Sahil的非正则表达式方法更可靠:

代码:(Demo

$strings=['<a class="ui small interactive circular label" style="background-color:#4bbedd;vertical-align:middle;" data-reactid=".0.1.1.1.3.0.0.1.1.1.1.0.$Aquatic Blue">',
'<a class="ui small interactive circular label" style="vertical-align:middle;background-color:#F27EB2;" data-reactid=".0.1.1.1.3.0.0.1.1.1.1.0.$Azalea">'
];

foreach($strings as $string){
     // trim away all text before "background-color:", then extract the value knowing its exact position
    echo substr(strstr($string,'background-color:'),17,7),"\n";
}

输出:

#4bbedd
#F27EB2