如何在字符列表中包含单引号和双引号?
How to include the single and double quotes in char list?
正则表达式我是这样写的
^[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]+$
正在检查的字符串是 symbol only
我使用检查器检查正则表达式是否正确。
然后我把它放到我的php代码中
$regex = "^[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]+$";
$regex = '^[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]+$';
我都试过了,但都不起作用,因为引号被正则表达式中的引号打破了。
我不想像
那样连接它们
$regex="{partA}".'"'."{partB}";
我觉得这个太难读了,不容易维护
如何解决这个问题?
你的两个正则表达式在 PHP 中产生语法错误,因为正则表达式本身内部有引号。
如果您不想将正则表达式连接成两个不同的部分,最好的方法是用反斜杠转义引号:
$regex = "^[-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/]+$";
$regex = '^[-!$%^&*()_+|~=`{}\[\]:";\'<>?,.\/]+$';
请注意,后者更可取,因为双引号将解析存储在字符串中的任何变量;如果 $
之后有任何文本和相应的变量,则变量的内容将被注入到正则表达式中:
$sample = 'text';
$regex = "^[-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/]+$sample";
echo $regex;
// ^[-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/]+text
除此之外,使用单引号也稍微快一些。
对于你的第一个表达式,这里我们可以使用 \x27 和 \x22 而不是引号,我们可能想要删除开始和结束字符,可能类似于:
[-!$%^&*()_+|~=`{}\[\]:\x22;\x27<>?,.\/]+
DEMO
正则表达式电路
jex.im 可视化正则表达式:
或者如果我理解正确的话,另一种选择是在第一个捕获组中收集所有字符,然后在第二个捕获组中保存我们想要的字母数字,可能类似于:
([\s\S].*?)([a-z0-9]+)?
测试
$re = '/([\s\S].*?)([a-z0-9]*)/mi';
$str = '{partA}".\'"\'."{partB}{partC12}".\'"\'."{partD109}{partA}".\'"\'."{partB}{partC12}".\'"\'."{partD109}';
$subst = ' ';
$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 = ` `;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
DEMO
也许你的正则表达式可以像^(?!.*[#\@])[[:punct:]]+$
一样简单?
[:punct:]
是 POSIX Bracket Expressions 之一。
https://regex101.com/r/4XnUzW/1/.
的演示和解释
正则表达式我是这样写的
^[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]+$
正在检查的字符串是 symbol only
我使用检查器检查正则表达式是否正确。
然后我把它放到我的php代码中
$regex = "^[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]+$";
$regex = '^[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]+$';
我都试过了,但都不起作用,因为引号被正则表达式中的引号打破了。
我不想像
那样连接它们$regex="{partA}".'"'."{partB}";
我觉得这个太难读了,不容易维护
如何解决这个问题?
你的两个正则表达式在 PHP 中产生语法错误,因为正则表达式本身内部有引号。
如果您不想将正则表达式连接成两个不同的部分,最好的方法是用反斜杠转义引号:
$regex = "^[-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/]+$";
$regex = '^[-!$%^&*()_+|~=`{}\[\]:";\'<>?,.\/]+$';
请注意,后者更可取,因为双引号将解析存储在字符串中的任何变量;如果 $
之后有任何文本和相应的变量,则变量的内容将被注入到正则表达式中:
$sample = 'text';
$regex = "^[-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/]+$sample";
echo $regex;
// ^[-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/]+text
除此之外,使用单引号也稍微快一些。
对于你的第一个表达式,这里我们可以使用 \x27 和 \x22 而不是引号,我们可能想要删除开始和结束字符,可能类似于:
[-!$%^&*()_+|~=`{}\[\]:\x22;\x27<>?,.\/]+
DEMO
正则表达式电路
jex.im 可视化正则表达式:
或者如果我理解正确的话,另一种选择是在第一个捕获组中收集所有字符,然后在第二个捕获组中保存我们想要的字母数字,可能类似于:
([\s\S].*?)([a-z0-9]+)?
测试
$re = '/([\s\S].*?)([a-z0-9]*)/mi';
$str = '{partA}".\'"\'."{partB}{partC12}".\'"\'."{partD109}{partA}".\'"\'."{partB}{partC12}".\'"\'."{partD109}';
$subst = ' ';
$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 = ` `;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
DEMO
也许你的正则表达式可以像^(?!.*[#\@])[[:punct:]]+$
一样简单?
[:punct:]
是 POSIX Bracket Expressions 之一。
https://regex101.com/r/4XnUzW/1/.