正则表达式写在“空变量”& “不是空变量”

时间:2013-11-16 23:27:29

标签: php regex string

我正在探索正则表达式。我的所有正则表达式都在使用反复试验。我对为空变量写作感到困惑。

我有这个正则表达式:

<[^>]*id=\"test3\"(.*)value=\"(.*?)\"[^>]*>

<input name="token" type="text" id="test3" value="valueA">

搜索 id =“test3”并在 value =“valueA”上写一个。是的,它“有效”但我的问题是,如果 value =“”为空,则不会。我对匹配标签非常困惑。

就好像我使用此标记执行上面的正则表达式

<input name="token" type="text" id="test3" value=""> 

EX:

PHP:

<?php

$html = file_get_contents('test.html');

$data['test1'] = 'TOKEN 1';

$data['test2'] = 'TOKEN 2';

foreach ($data as $id => $value)
{

    if(preg_match('%<[^>]*id=\"'.$id.'\"(.*)value=\"(.*?)\"[^>]*>%', $html, $match))
    {
        $html = str_replace($match[2], $value, $html);
    }

}

echo $html;

?>

HTML:          

<input name="token1" type="text" id="test1" value="" />

<input name="token2" type="text" id="test2" value="B" />

</body>
</html>

期望的输出:

TOKEN 1

TOKEN 2

它不会在空值=“”中写任何变量,请帮我配对吗?

我已将测试链接包含在我的正则表达式

TRY IT!

这个问题有一个很好的答案,但我真的很困惑匹配

MATCHED

3 个答案:

答案 0 :(得分:2)

如果要使用正则表达式执行替换,则必须使用preg_replace()函数:

$html = preg_replace('/<[^>]*?\bid="test3".*?\svalue="\K[^"]*(?="[^>]*>)/is',
                     'A', $html);

模式细节:

<[^>]*?\bid="test3" 
.*?                #  I use a lazy quantifier to avoid to match
                   # the last "value" attribute of the file
\svalue="          #  The space prevent you to match an
                   # hypotetic "abcdvalue" attribute
\K                 #  remove all that have been matched before from 
                   # the match result
[^"]*              #  all characters that are not a "
(?="[^>]*>)        #  a lookahead to check the end of the tag.
                   # it's only a check, the subpattern inside 
                   # is not in the match result too

最后的s修饰符适用于dotall模式(.也可以匹配换行符)

要将它与数组一起使用,您只需执行以下操作:

foreach ($data as $id=>$value) {
    $html = preg_replace('/<[^>]*?\bid="' . $id . '".*?\svalue="\K[^"]*(?="[^>]*>)/is',
                         $value, $html);
}

答案 1 :(得分:1)

preg_replace('/<[^>]*\bid=\"test3\"[^>]*\bvalue=\"\K[^\"]*/', $value, $html);

参见演示 here


更新 (根据OP的评论)

if (preg_match('/(<[^>]*\bid=\"test3\"[^>]*\bvalue=\")([^\"]*)/', $html, $match))
{
  $html = str_replace($match[1].$match[2], $match[1].$value, $html);    
}

参见演示 here

答案 2 :(得分:0)

使用此正则表达式:

<[^>]*id=\"test3\"(.*)(value=\".*?\")[^>]*>

然后在您的代码中,执行以下操作:

$html = str_replace($match[2], 'value="'.$value.'"', $html);

在regex101.com上查看:http://regex101.com/r/qF9yH4