正则表达式:用其值替换多个输入字段

时间:2015-07-08 18:00:21

标签: php regex forms input html-parsing

我想使用正则表达式将输入标记替换为其对应的值。 搜索必须包含输入的名称,因为我有多个输入需要替换相同的表单。

例如,我需要以下字符串:

<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);
}

但是,这将使用第一个值替换所有输入,因此我需要优化正则表达式以包含名称。

非常感谢你的帮助!

  • 西普里安

2 个答案:

答案 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