我想使用正则表达式将输入标记替换为其对应的值。 搜索必须包含输入的名称,因为我有多个输入需要替换相同的表单。
例如,我需要以下字符串:
<input value="Your Name" name="custom_field_1">
成为:
Your Name
我目前的代码如下:
foreach ($_POST as $key => $value) {
if($key == 'post_id') continue;
$content = preg_replace("/<\s* input [^>]+ >/xi", htmlspecialchars($value), $content);
}
但是,这将使用第一个值替换所有输入,因此我需要优化正则表达式以包含名称。
非常感谢你的帮助!
答案 0 :(得分:1)
您可以匹配整个字符串,使用括号(..)
捕获值,创建捕获组,并将匹配替换为$1
- 第一个捕获组。
<input value="(.+?)" name=".*?">
https://regex101.com/r/rH1wA2/3
尝试:
preg_replace("<input value=\\"(.+?)\\" name=\\".*?\\">", $1, $str)
请注意,此正则表达式具有“值”,“名称”甚至空格。如果您的字符串有时看起来不同,则必须考虑到这一点并相应地更改正则表达式。例如,<input value="(.+?)"[^>]*>
无论您的期望值如何都可以替换。
答案 1 :(得分:1)
这应该有用
只需将匹配替换为$1
# (?s)<input(?=\s)(?>(?:(?<=\s)value\s*=\s*"([^"]+)"|".*?"|'.*?'|[^>]*?)+>)(?(1)|(?!))
(?s)
<input # Input tag
(?= \s )
(?> # Atomic grouping
(?:
(?<= \s )
value \s* = \s* # 'value' attribute
"
( # (1 start), 'value' data
[^"]+
) # (1 end)
"
| " .*? "
| ' .*? '
| [^>]*?
)+
>
)
(?(1) # Conditional - Only input tags with a 'value' attr
| (?!)
)
示例:
<input type="hidden" value="Special:Search" name="title" />
输出:
** Grp 0 - ( pos 0 , len 59 )
<input type="hidden" value="Special:Search" name="title" />
** Grp 1 - ( pos 28 , len 14 )
Special:Search