正则表达式匹配特定符号 '-" ( ) * , . : … ; ?`
regex match specific symbol ' - " ( ) * , . : … ; ? `
我想构建一个将这些特定符号标记为 "SYM" 的正则表达式。因此,我正在 php 中构建一个正则表达式,它将匹配这个特定的符号 ONLY.Is 有任何接受这些符号的正则表达式吗?
' - " ( ) * , . : … ; ? `
输出应该是这样的:
'\符号
- \SYM
"\符号
(\符号
) \SYM 等等...
这是我的程序,但它不起作用:
<?php
$str = "'this' is Mary! (a dog - not a human)";
$split = explode(" ",$str);
foreach($split as $value) {
$match = array();
$count = preg_match_all("/\!/|\'/|\-/",$value,$match);
if ($count != 0)
$text = "\SYM";
else
$text = "\not SYM";
echo "<br>".$count." ".$value." ".$text;
}
?>
您的代码可能和
一样简单
<?php
$in = "'this' is Mary! (a dog - not a human)";
$out = preg_replace('/([-\'"()*,.:…;?`])/', '\SYM ', $in);
echo $out;
正则表达式 /([-'"()*,.:…;?])/
匹配您的每个特殊字符并捕获它供以后使用,但要注意:破折号 (-
) 应该是第一个 在字符 class 中以避免创建范围,单引号需要转义(对于 PHP)。替换只是将捕获(首先从左侧捕获括号,因此 </code>)替换为自身并附加字符串 <em>\SYM</em> 和 <em>whitespace</em>.如果您需要在替换周围使用更多空格,您可以将替换字符串更改为 <code>' \SYM '
或 ' \SYM '
甚至 ' \SYM '
一个更"sophisticated"(或优雅,或书呆子)的使用环视的方法看起来几乎相同:
$out = preg_replace('/(?<=[-\'"()*,.:…;?`])/', '\SYM ', $in);
主要区别在于,它不捕获特殊字符,而是匹配右 BEHIND 字符。请注意,此处仅匹配 position,此位置(将其想象为一个空字符串)将被您的标记替换 - 实际上只是 插入你的标记
两种方法提供相同的输出:
'\SYM this'\SYM is Mary! (\SYM a dog -\SYM not a human)\SYM
我想你想要做的是将一个字符串标记为标点符号块(那些 SYM
个)和由其他字符组成的块(不包括空格,那些 not SYM
个) .
使用
$sym_rx = "~(?:([^-'\"()*,.:…;?`\s]+)|([-'\"()*,.:…;?`]))(\s)*~u";
$str = "'this' is Mary! (a dog - not a human)";
echo preg_replace_callback($sym_rx, function ($m) {
$ins = !empty($m[2]) ? $m[2] . "\SYM" : $m[1] . "\not SYM";
return !empty($m[3]) ? $ins . $m[3] : $ins . " ";
}, $str);
// => '\SYM this\not SYM '\SYM is\not SYM Mary!\not SYM (\SYM a\not SYM dog\not SYM -\SYM not\not SYM a\not SYM human\not SYM )\SYM
我想构建一个将这些特定符号标记为 "SYM" 的正则表达式。因此,我正在 php 中构建一个正则表达式,它将匹配这个特定的符号 ONLY.Is 有任何接受这些符号的正则表达式吗?
' - " ( ) * , . : … ; ? `
输出应该是这样的: '\符号 - \SYM "\符号 (\符号 ) \SYM 等等...
这是我的程序,但它不起作用:
<?php
$str = "'this' is Mary! (a dog - not a human)";
$split = explode(" ",$str);
foreach($split as $value) {
$match = array();
$count = preg_match_all("/\!/|\'/|\-/",$value,$match);
if ($count != 0)
$text = "\SYM";
else
$text = "\not SYM";
echo "<br>".$count." ".$value." ".$text;
}
?>
您的代码可能和
一样简单<?php
$in = "'this' is Mary! (a dog - not a human)";
$out = preg_replace('/([-\'"()*,.:…;?`])/', '\SYM ', $in);
echo $out;
正则表达式 /([-'"()*,.:…;?])/
匹配您的每个特殊字符并捕获它供以后使用,但要注意:破折号 (-
) 应该是第一个 在字符 class 中以避免创建范围,单引号需要转义(对于 PHP)。替换只是将捕获(首先从左侧捕获括号,因此 </code>)替换为自身并附加字符串 <em>\SYM</em> 和 <em>whitespace</em>.如果您需要在替换周围使用更多空格,您可以将替换字符串更改为 <code>' \SYM '
或 ' \SYM '
甚至 ' \SYM '
一个更"sophisticated"(或优雅,或书呆子)的使用环视的方法看起来几乎相同:
$out = preg_replace('/(?<=[-\'"()*,.:…;?`])/', '\SYM ', $in);
主要区别在于,它不捕获特殊字符,而是匹配右 BEHIND 字符。请注意,此处仅匹配 position,此位置(将其想象为一个空字符串)将被您的标记替换 - 实际上只是 插入你的标记
两种方法提供相同的输出:
'\SYM this'\SYM is Mary! (\SYM a dog -\SYM not a human)\SYM
我想你想要做的是将一个字符串标记为标点符号块(那些 SYM
个)和由其他字符组成的块(不包括空格,那些 not SYM
个) .
使用
$sym_rx = "~(?:([^-'\"()*,.:…;?`\s]+)|([-'\"()*,.:…;?`]))(\s)*~u";
$str = "'this' is Mary! (a dog - not a human)";
echo preg_replace_callback($sym_rx, function ($m) {
$ins = !empty($m[2]) ? $m[2] . "\SYM" : $m[1] . "\not SYM";
return !empty($m[3]) ? $ins . $m[3] : $ins . " ";
}, $str);
// => '\SYM this\not SYM '\SYM is\not SYM Mary!\not SYM (\SYM a\not SYM dog\not SYM -\SYM not\not SYM a\not SYM human\not SYM )\SYM