Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.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_Code Snippets - Fatal编程技术网

PHP:如何将这个句子转换成给定的格式

PHP:如何将这个句子转换成给定的格式,php,regex,code-snippets,Php,Regex,Code Snippets,“[5 |五][提示|建议]一次难忘的旅行|五 关于一次不可遗憾的旅行的建议 一次[惊人的]旅行|五条[建议] “惊人之旅” 到 “[5 |五条][小贴士|建议]一次难忘的旅行~5条 关于一次不可后悔的旅行的建议 一次[不可思议的]旅行~5条[建议] “惊人之旅” 我可以使用str\u替换(“|”、“~”、$code),但问题是我不想将“|”转换为“~”,如果它介于($I=0,$s=strlen($str)之间,$c=0;$i您可能会使用PHP preg_match并与str_replace结合

“[5 |五][提示|建议]一次难忘的旅行|五 关于一次不可遗憾的旅行的建议 一次[惊人的]旅行|五条[建议] “惊人之旅”

“[5 |五条][小贴士|建议]一次难忘的旅行~5条 关于一次不可后悔的旅行的建议 一次[不可思议的]旅行~5条[建议] “惊人之旅”


我可以使用
str\u替换(“|”、“~”、$code)
,但问题是我不想将
“|”
转换为
“~”
,如果它介于($I=0,$s=strlen($str)之间,$c=0;$i您可能会使用PHP preg_match并与str_replace结合使用-我不是regexp专家,因此无法为您编写任何内容


这个正则表达式应该做你想要做的事
/^(?)

结合
preg\u replace
和klabamo,您就得到了:)

这现在似乎工作得好多了

$sentence = "[5|five] [Tips|Suggestions] for an Unforgettable Trip~Five suggestions for a un-regret able Trip~[5|five] [tips|suggestions] for an [amazing|incredible] Trip~Five [tips|suggestions] for an astonishing Trip";

$newSentence = preg_replace("/^(?<!\[.)\|(?!].)/", "~", $sentence);

echo $newSentence;
$句子=“[5 | 5][Tips |建议]难忘之旅~5条不可后悔之旅的建议~[5 | 5][Tips |建议]惊人之旅~5条[提示|建议]”;
$newSentence=preg|u replace(“/^(?
$in=“[5 | 5][Tips |建议]难忘之旅| 5建议不可后悔之旅|[5 | 5][Tips |建议]惊人之旅| 5建议];

$out=preg_replace('/(?您可以先用str_replace替换所有,然后重新替换
[]
()中的:


如果您知道方括号将始终保持适当平衡且从不嵌套,则只需进行简单的前瞻:

$after = preg_replace('/\|(?![^][]*+\])/', '~', $before);

在管道字符之后立即开始,向前看会扫描下一个右方括号。如果它在没有看到左方括号的情况下找到一个右方括号,则管道必须位于一对括号内。不需要使用向后看来检查开始括号,这很好,因为PHP(与大多数正则表达式一样)不支持可变宽度lookbehind

我使用了消极前瞻,但积极前瞻也可以:

$after = preg_replace('/\|(?=[^][]*+(?:\[|$))/', '~', $before);

请注意,如果字符类中的右方括号是列出的第一个字符(或者,在本例中,是求反
^
后的第一个字符),则无需转义右方括号。因此,“非方括号”的奇数
[^][]
。和
*+
是一个字符


如果方括号可以嵌套,你应该忘记正则表达式,继续使用。可能仍然可以使用正则表达式,但它会更加复杂。

你的句子是作为任何变量的输入吗?当然有点过火了?@James我很累,所以可能遗漏了一些东西,但你的解决方案似乎无法正常运行例如,因为它不能在
]
之间匹配任意数量的字符。这可以正常工作。@詹姆斯:你的正则表达式在preg\u replace中不起作用,杰里米的不行。为了减少开销,在我的正则表达式中,我正在处理否定。我更新了正则表达式并提供了一个例子。它在是测试用例。不,它不起作用。你的“before”字符串与OP的“after”字符串相同;你的代码没有改变任何东西。我刚刚下载并尝试过,它工作得非常好!!非常感谢你的帮助。是的,这个也工作得很好,谢谢你!!棒极了!!
$subject = '[5|five] [Tips|Suggestions] for an Unforgettable Trip|Five suggestions for a 
un-regret able Trip|[5|five] [tips|suggestions] for an [amazing|incredible] Trip|Five [tips|suggestions] for an astonishing Trip';
$result = str_replace('|', '~', $subject);
$pattern = '((\[[^\]]*)~([^\[]*\]))';
$result = preg_replace($pattern, '$1|$2', $result);

var_dump($subject, $result);
$after = preg_replace('/\|(?![^][]*+\])/', '~', $before);
$after = preg_replace('/\|(?=[^][]*+(?:\[|$))/', '~', $before);