Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式是否将标点移到标记之外?_Php_Regex_Preg Replace_Preg Match All - Fatal编程技术网

Php 正则表达式是否将标点移到标记之外?

Php 正则表达式是否将标点移到标记之外?,php,regex,preg-replace,preg-match-all,Php,Regex,Preg Replace,Preg Match All,出于数据清理的目的,我需要将某些结束标记(a,b,I,strong,em)前面的标点(逗号和句点)移动到这些结束标记的另一侧 例如,这段文字: <p>Lorem ipsum dolor sit <i>amet,</i> consectetur adipiscing elit.</p> 忽略所有关于的问题,这对我来说很有用: $re = "/([\\W]+)(<\\/(a|b|em|i|strong)>)/"; $str = "<

出于数据清理的目的,我需要将某些结束标记(
a
b
I
strong
em
)前面的标点(逗号和句点)移动到这些结束标记的另一侧

例如,这段文字:

<p>Lorem ipsum dolor sit <i>amet,</i> consectetur adipiscing elit.</p>

忽略所有关于的问题,这对我来说很有用:

$re = "/([\\W]+)(<\\/(a|b|em|i|strong)>)/"; 
$str = "<p>Lorem ipsum dolor sit <i>amet, </i>consectetur adipiscing elit.</p>"; 
$subst = "$2$1"; 

$result = preg_replace($re, $subst, $str);
$re=“/([\\W]+)()/”;
$str=“Lorem ipsum door sit amet,concetetur adipiscing elite.

”; $subst=“$2$1”; $result=preg_replace($re,$subst,$str);

您可以查看它。

此方法使用两个捕获组:一个捕获逗号或句点,后跟零个或多个空格,另一个捕获结束标记
preg_replace
用于颠倒顺序

$string = '<p>Lorem ipsum dolor sit <i>amet, </i>consectetur adipiscing elit.</p>';
$pattern = '/([,.] *)(<\/(?:a|b|em|i|strong)>)/g';
$replacement = '$2$1';

$result = preg_replace( $pattern, $replacement, $string );
$string='Lorem ipsum door sit amet,concetetur adipiscing elite.

'; $pattern='/([,.]*)()/g'; $replacement='$2$1'; $result=preg_replace($pattern,$replacement,$string);

这里有一个问题。

要求我们为您编写它并不是如何使用此网站。祝你好运,上帝保佑你!我建议你先写一个正则表达式,把要移动的字符放在一个捕获组中,然后把它们移到替换字符串中的另一边。如果它考虑到这样的情况<代码> AMET,GO,< /Cord>?@罗马PrimeHels:好点。我不这么认为——这个问题主要是关于清理结束标记附近的标点符号,因此确定标记内的标点符号后面是否应该有空格,或者确定是否应该将开始标记后的空格移到开始标记的另一侧,似乎不属于当前范围。是否应编辑问题标题以澄清这一点?我试图想出一个更准确的标题,但我尝试的每件事都显得太冗长了。如果有人有更好的想法,请随意编辑。@4castle:FWIW,我计划自己回答这个问题:)不需要双重转义:
([\W]+)(\
。此外,如果您使用另一个分隔符(例如
~
),您的正则表达式变得更加清晰:不需要
\b
,因为这些单词的两侧都有字符文本,而这些字符不是单词。双转义符来自正则表达式101的代码生成器。我已经去掉了
\b
和一些其他不必要的转义字符。但是,如果您对正则表达式使用单引号在PHP中,它永远不会出现错误使用字符串转义序列的问题。是的,我不确定代码生成器为什么会这样做:/FWIK它会在双引号字符串中双转义反斜杠,以确保
\3
或这样的八进制转义序列不会被解释为表示
\003
文本结尾的
字符er而不是对第三个捕获组的反向引用。@4castleFixed。如果答案不令人满意,请随意编辑。感谢您的提示re:
\0
,这很好!现在看起来不错:)如果可能,最好使用非捕获组,因为它执行速度更快,并且不会干扰比赛中的捕获组。
$re = "/([\\W]+)(<\\/(a|b|em|i|strong)>)/"; 
$str = "<p>Lorem ipsum dolor sit <i>amet, </i>consectetur adipiscing elit.</p>"; 
$subst = "$2$1"; 

$result = preg_replace($re, $subst, $str);
$string = '<p>Lorem ipsum dolor sit <i>amet, </i>consectetur adipiscing elit.</p>';
$pattern = '/([,.] *)(<\/(?:a|b|em|i|strong)>)/g';
$replacement = '$2$1';

$result = preg_replace( $pattern, $replacement, $string );