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

时间:2019-05-22 04:18:01

标签: php regex regex-negation regex-lookarounds regex-greedy

我这样写正则表达式

^[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]+$

正在检查字符串为symbol only

我使用检查器检查正则表达式是否正确。

然后我将其放入我的php代码中

$regex = "^[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]+$";
$regex = '^[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]+$';

我都尝试过,但是它不起作用,因为正则表达式中的引号将引号引起来。

我不想像

$regex="{partA}".'"'."{partB}";

我认为这太难读且不容易维护

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

由于正则表达式本身内部带有引号,因此您的两个正则表达式都在PHP中产生语法错误。

如果您不想将正则表达式分为两个不同部分,则最好的方法是使用反斜杠转义引号:

$regex = "^[-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/]+$";
$regex = '^[-!$%^&*()_+|~=`{}\[\]:";\'<>?,.\/]+$';

请注意,后者更为可取,因为双引号将解析字符串中存储的所有变量;如果$之后有任何文本以及相应的变量,则该变量的内容将被注入到正则表达式中:

$sample = 'text';
$regex = "^[-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/]+$sample";

echo $regex;
// ^[-!$%^&*()_+|~=`{}\[\]:\";'<>?,.\/]+text

除此之外,使用单引号也稍快一些。

答案 1 :(得分:0)

对于您的第一个表达式,在这里我们可以使用\ x27和\ x22代替引号,并且我们可能希望删除开始和结束字符,也许类似于:

[-!$%^&*()_+|~=`{}\[\]:\x22;\x27<>?,.\/]+

enter image description here

DEMO

RegEx电路

jex.im可视化正则表达式:

enter image description here

或者,如果我理解正确,另一种替代方法是收集第一个捕获组中的所有字符,然后将所需的字母数字保存在第二个捕获组中,也许类似于:

([\s\S].*?)([a-z0-9]+)?

enter image description here

测试

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

DEMO

答案 2 :(得分:0)

也许您的正则表达式可以像sudo service apache2 restart 一样简单?
^(?!.*[#\\@])[[:punct:]]+$POSIX Bracket Expressions之一。
https://regex101.com/r/4XnUzW/1/上进行演示和说明。