如何在字符列表中包含单引号和双引号?

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/.

的演示和解释