我这样写正则表达式
^[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]+$
正在检查字符串为symbol only
我使用检查器检查正则表达式是否正确。
然后我将其放入我的php代码中
$regex = "^[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]+$";
$regex = '^[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]+$';
我都尝试过,但是它不起作用,因为正则表达式中的引号将引号引起来。
我不想像
$regex="{partA}".'"'."{partB}";
我认为这太难读且不容易维护
我该如何解决这个问题?
答案 0 :(得分:1)
由于正则表达式本身内部带有引号,因此您的两个正则表达式都在PHP中产生语法错误。
如果您不想将正则表达式分为两个不同部分,则最好的方法是使用反斜杠转义引号:
$regex = "^[-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/]+$";
$regex = '^[-!$%^&*()_+|~=`{}\[\]:";\'<>?,.\/]+$';
请注意,后者更为可取,因为双引号将解析字符串中存储的所有变量;如果$
之后有任何文本以及相应的变量,则该变量的内容将被注入到正则表达式中:
$sample = 'text';
$regex = "^[-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/]+$sample";
echo $regex;
// ^[-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/]+text
除此之外,使用单引号也稍快一些。
答案 1 :(得分:0)
对于您的第一个表达式,在这里我们可以使用\ x27和\ x22代替引号,并且我们可能希望删除开始和结束字符,也许类似于:
[-!$%^&*()_+|~=`{}\[\]:\x22;\x27<>?,.\/]+
jex.im可视化正则表达式:
或者,如果我理解正确,另一种替代方法是收集第一个捕获组中的所有字符,然后将所需的字母数字保存在第二个捕获组中,也许类似于:
([\s\S].*?)([a-z0-9]+)?
$re = '/([\s\S].*?)([a-z0-9]*)/mi';
$str = '{partA}".\'"\'."{partB}{partC12}".\'"\'."{partD109}{partA}".\'"\'."{partB}{partC12}".\'"\'."{partD109}';
$subst = '$2 ';
$result = preg_replace($re, $subst, $str);
echo $result;
const regex = /([\s\S].*?)([a-z0-9]*)/gmi;
const str = `{partA}".'"'."{partB}{partC12}".'"'."{partD109}{partA}".'"'."{partB}{partC12}".'"'."{partD109}`;
const subst = `$2 `;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
答案 2 :(得分:0)
也许您的正则表达式可以像sudo service apache2 restart
一样简单?
^(?!.*[#\\@])[[:punct:]]+$
是POSIX Bracket Expressions之一。
在https://regex101.com/r/4XnUzW/1/上进行演示和说明。