如何使用正则表达式或数组将输入字符串转换为所需(给定)格式?
How to convert input string to desired(given) format using regex or arrays?
我有这样的用户输入字符串
" |appl | pinea | orang frui | vege lates"
我想把它转换成这种格式
"+(appl* | pinea* | orang*) +(frui* | vege*) +(lates*)"
我尝试使用 preg_match 和数组,但无法找到解决方案
$term = " |appl | pinea | orang frui | vege lates";
$term = trim($term, "| ");
$term = preg_replace("#[\| ]{2,}#", " | ", $term);
// $term value is "appl | pinea | orang frui | vege lates" after applying safe guards
// $matches = [];
// $matched = preg_match_all("#(\P{Xan}+)\|(\P{Xan}+)#ui", $term, $matches);
// var_dump($matches);
$termArray = explode(" ", $term);
foreach($termArray as $index => $singleWord) {
$termArray[$index] = trim($singleWord);
}
$termArray = array_filter($termArray);
foreach($termArray as $index => $singleWord) {
if($singleWord === "|") {
$pipeIndexes[] = $index;
$orIndexes[] = $index - 1;
$orIndexes[] = $index + 1;
unset($termArray[$index]);
}
}
// desired string I am hoping for
// "+(appl* | pinea* | orang*) +(frui* | vege*) +(lates*)"
我希望得到的字符串
"+(appl* | pinea* | orang*) +(frui* | vege*) +(lates*)"
假设您已将输入字符串清理为以下内容:
appl | pinea | orang frui | vege lates
快速工作示例
<?php
$subject = 'appl | pinea | orang frui | vege lates';
// Add the "*" in place at end
$subject = preg_replace('/[a-z]+/i', '[=11=]*', $subject);
// Group the terms adding brackets and + sign
$result = preg_replace('/(?:[^\s|]+\s*\|\s*)*(?:[^\s|]+)/i', '+([=11=])', $subject);
var_dump($result);
// Outputs:
// string(53) "+(appl* | pinea* | orang*) +(frui* | vege*) +(lates*)"
在每个单词后添加*
:
$result = preg_replace('/[a-z]+/i', '[=12=]*', $subject);
分组基于space
$result = preg_replace('/(?:[^\s|]+\s*\|\s*)*(?:[^\s|]+)/i', '+([=13=])', $subject);
可视化
人类可读
(?:[^\s|]+\s*\|\s*)*(?:[^\s|]+)
选项:不区分大小写;精确的间距;点不匹配换行符; ^$ 不匹配换行符;贪婪量词;仅正则表达式语法
- 匹配下面的正则表达式
(?:[^\s|]+\s*\|\s*)*
- 在零次和无限次之间,尽可能多次,按需回馈(贪心)
*
- 匹配下面列表中不存在的任何单个字符
[^\s|]+
- 一次到无限次之间,尽可能多次,按需回馈(贪心)
+
- 一个“白色space字符”(任何Unicode分隔符、制表符、换行符、回车符return、垂直制表符、换页符、下一行)
\s
- 文字字符“|”
|
- 匹配“白色space字符”的单个字符(任何Unicode分隔符、制表符、换行符、回车符return、垂直制表符、换页符、下一行)
\s*
- 在零次和无限次之间,尽可能多次,按需回馈(贪心)
*
- 匹配字符“|”字面上
\|
- 匹配“白色space字符”的单个字符(任何Unicode分隔符、制表符、换行符、回车符return、垂直制表符、换页符、下一行)
\s*
- 在零次和无限次之间,尽可能多次,按需回馈(贪心)
*
- 匹配下面的正则表达式
(?:[^\s|]+)
- 匹配下面列表中不存在的任何单个字符
[^\s|]+
- 一次到无限次之间,尽可能多次,按需回馈(贪心)
+
- 一个“白色space字符”(任何Unicode分隔符、制表符、换行符、回车符return、垂直制表符、换页符、下一行)
\s
- 文字字符“|”
|
+([=32=])
- 字面插入字符“+”
+
- 插入左括号
(
- 插入整个正则表达式匹配
[=35=]
- 插入右括号
)
我有这样的用户输入字符串
" |appl | pinea | orang frui | vege lates"
我想把它转换成这种格式
"+(appl* | pinea* | orang*) +(frui* | vege*) +(lates*)"
我尝试使用 preg_match 和数组,但无法找到解决方案
$term = " |appl | pinea | orang frui | vege lates";
$term = trim($term, "| ");
$term = preg_replace("#[\| ]{2,}#", " | ", $term);
// $term value is "appl | pinea | orang frui | vege lates" after applying safe guards
// $matches = [];
// $matched = preg_match_all("#(\P{Xan}+)\|(\P{Xan}+)#ui", $term, $matches);
// var_dump($matches);
$termArray = explode(" ", $term);
foreach($termArray as $index => $singleWord) {
$termArray[$index] = trim($singleWord);
}
$termArray = array_filter($termArray);
foreach($termArray as $index => $singleWord) {
if($singleWord === "|") {
$pipeIndexes[] = $index;
$orIndexes[] = $index - 1;
$orIndexes[] = $index + 1;
unset($termArray[$index]);
}
}
// desired string I am hoping for
// "+(appl* | pinea* | orang*) +(frui* | vege*) +(lates*)"
我希望得到的字符串 "+(appl* | pinea* | orang*) +(frui* | vege*) +(lates*)"
假设您已将输入字符串清理为以下内容:
appl | pinea | orang frui | vege lates
快速工作示例
<?php
$subject = 'appl | pinea | orang frui | vege lates';
// Add the "*" in place at end
$subject = preg_replace('/[a-z]+/i', '[=11=]*', $subject);
// Group the terms adding brackets and + sign
$result = preg_replace('/(?:[^\s|]+\s*\|\s*)*(?:[^\s|]+)/i', '+([=11=])', $subject);
var_dump($result);
// Outputs:
// string(53) "+(appl* | pinea* | orang*) +(frui* | vege*) +(lates*)"
在每个单词后添加*
:
$result = preg_replace('/[a-z]+/i', '[=12=]*', $subject);
分组基于space
$result = preg_replace('/(?:[^\s|]+\s*\|\s*)*(?:[^\s|]+)/i', '+([=13=])', $subject);
可视化
人类可读
(?:[^\s|]+\s*\|\s*)*(?:[^\s|]+)
选项:不区分大小写;精确的间距;点不匹配换行符; ^$ 不匹配换行符;贪婪量词;仅正则表达式语法
- 匹配下面的正则表达式
(?:[^\s|]+\s*\|\s*)*
- 在零次和无限次之间,尽可能多次,按需回馈(贪心)
*
- 匹配下面列表中不存在的任何单个字符
[^\s|]+
- 一次到无限次之间,尽可能多次,按需回馈(贪心)
+
- 一个“白色space字符”(任何Unicode分隔符、制表符、换行符、回车符return、垂直制表符、换页符、下一行)
\s
- 文字字符“|”
|
- 一次到无限次之间,尽可能多次,按需回馈(贪心)
- 匹配“白色space字符”的单个字符(任何Unicode分隔符、制表符、换行符、回车符return、垂直制表符、换页符、下一行)
\s*
- 在零次和无限次之间,尽可能多次,按需回馈(贪心)
*
- 在零次和无限次之间,尽可能多次,按需回馈(贪心)
- 匹配字符“|”字面上
\|
- 匹配“白色space字符”的单个字符(任何Unicode分隔符、制表符、换行符、回车符return、垂直制表符、换页符、下一行)
\s*
- 在零次和无限次之间,尽可能多次,按需回馈(贪心)
*
- 在零次和无限次之间,尽可能多次,按需回馈(贪心)
- 在零次和无限次之间,尽可能多次,按需回馈(贪心)
- 匹配下面的正则表达式
(?:[^\s|]+)
- 匹配下面列表中不存在的任何单个字符
[^\s|]+
- 一次到无限次之间,尽可能多次,按需回馈(贪心)
+
- 一个“白色space字符”(任何Unicode分隔符、制表符、换行符、回车符return、垂直制表符、换页符、下一行)
\s
- 文字字符“|”
|
- 一次到无限次之间,尽可能多次,按需回馈(贪心)
- 匹配下面列表中不存在的任何单个字符
+([=32=])
- 字面插入字符“+”
+
- 插入左括号
(
- 插入整个正则表达式匹配
[=35=]
- 插入右括号
)