我正在探索正则表达式。我的所有正则表达式都在使用反复试验。我对为空变量写作感到困惑。
我有这个正则表达式:
<[^>]*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
它不会在空值=“”中写任何变量,请帮我配对吗?
我已将测试链接包含在我的正则表达式
中这个问题有一个很好的答案,但我真的很困惑匹配
答案 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