将字符串与另一个具有动态字符串内容的字符串匹配
Match string with another string having dynamic string content
我想匹配第一个字符串和第二个字符串。第二个字符串将在 {} 中包含动态内容。它也由 | 分隔,因为我需要将第一个字符串与第二个字符串的多个值和 return 布尔值相匹配。此外,如果第一个字符串值与第二个字符串的部分值匹配,我需要第一个字符串的动态变量。我已经尝试和搜索了很多并得出了这个
$message = "wala hi";
$pattern = "Mujhey|mujhe|mujh'y|mjy?|mujy|wala {dynamicontent}";
$pattern = str_replace('/', '\/', $pattern);
$text = '/^'.preg_replace('/\{((?:(?!\d+,?\d+?)\w)+?)\}/', '(?<>.*)', $pattern).' ?$/miu';
$regexMatched = (bool) preg_match($text, $message, $matches) || (bool) preg_match($text, '', $matches);
var_dump([$regexMatched, $matches]);
它仍然无法正常工作。
以下可以是输入、要匹配的模式 = 和所需的输出:
- 输入:播放演示歌曲,模式:播放{song},输出:returns true and demo-song
- 输入:播放演示歌曲,模式:播放{歌曲},输出:returns false and null
- 输入:显示 hoizer 个人资料,模式:显示 {artist} 个人资料,输出:returns true and hoizer
- 输入:显示 GOT 的 2019 季,模式:显示 {series} 的 {year} 季,输出:returns true and [0=>2019, 1=>GOT]
PS:字符串将包含表情符号和 ?,'。
我只是猜测您有几个包含各种组件的句子,并且您希望提取或替换其中的某些所需部分。
您可能希望首先对您的输入进行分类,然后通过一些函数将其传递以进行匹配或替换。这个一般表达式可能没问题,只是看一下你想如何为你的输入设计和编写一些表达式:
play\s+([^,]+?)\s*,|show\s+(.*?)\s+profile|show\s+(\d{4})\s+season\s+of\s+([^,]+?)\s*,|i(?:'m)?\s+.*?(?:\ba\b|\ban\b)\s+(\S+)
如果您可能在某些特定表达式上遇到过一些技术问题,您可以 post 一个一个地解决这些问题,也许有一些真实的输入和期望的输出。
表达式在 regex101.com, if you wish to explore/simplify/modify it, and in this link 的右上面板中进行了解释,如果您愿意,您可以观察它如何与一些示例输入匹配。
测试
$re = '/play\s+([^,]+?)\s*,|show\s+(.*?)\s+profile|show\s+(\d{4})\s+season\s+of\s+([^,]+?)\s*,|i(?:\'m)?\s+.*?(?:\ba\b|\ban\b)\s+(\S+)/mi';
$str = 'play demo-song, pattern: play {song},
show hoizer profile, pattern: show {artist} profile
show 2019 season of GOT, pattern: show {year} season of {series},
PLAY demo-song, pattern: PLay {song},
SHOW hoizer some other artists profile, pattern: show {artist} profile
show 2019 SEASON OF GOT , pattern: show {year} season of {series},
i am a student I AM A programmer i\'m a suergeon pattern: I\'m a {profession}, ';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);
正则表达式电路
jex.im 可视化正则表达式:
到目前为止,这是满足我要求的解决方案。谢谢你的帮助@Emma。
function checkPattern($stringToTest, $pattern) {
str_replace("\|", "|", preg_quote($pattern));
$pattern = str_replace("|", "$|^", preg_replace('/' . preg_quote('{') . '.*?' .preg_quote('}') . '/', '(.*)', $pattern));
$regexMatched = (bool) preg_match("/^".$pattern."$/mi", $stringToTest, $matches);
var_dump([$regexMatched, end($matches)]);
}
//test 1 returns [true, hozier]
$stringToTest = "play songs by hozier";
$pattern = "play songs by {artist}|play {artist} songs|{artist} songs";
checkPattern($stringToTest, $pattern);
//test 2 returns [false, false]
$stringToTest = "show hozier";
$pattern = "show {artist} profile|view {artist} profile";
checkPattern($stringToTest, $pattern);
我想匹配第一个字符串和第二个字符串。第二个字符串将在 {} 中包含动态内容。它也由 | 分隔,因为我需要将第一个字符串与第二个字符串的多个值和 return 布尔值相匹配。此外,如果第一个字符串值与第二个字符串的部分值匹配,我需要第一个字符串的动态变量。我已经尝试和搜索了很多并得出了这个
$message = "wala hi";
$pattern = "Mujhey|mujhe|mujh'y|mjy?|mujy|wala {dynamicontent}";
$pattern = str_replace('/', '\/', $pattern);
$text = '/^'.preg_replace('/\{((?:(?!\d+,?\d+?)\w)+?)\}/', '(?<>.*)', $pattern).' ?$/miu';
$regexMatched = (bool) preg_match($text, $message, $matches) || (bool) preg_match($text, '', $matches);
var_dump([$regexMatched, $matches]);
它仍然无法正常工作。
以下可以是输入、要匹配的模式 = 和所需的输出:
- 输入:播放演示歌曲,模式:播放{song},输出:returns true and demo-song
- 输入:播放演示歌曲,模式:播放{歌曲},输出:returns false and null
- 输入:显示 hoizer 个人资料,模式:显示 {artist} 个人资料,输出:returns true and hoizer
- 输入:显示 GOT 的 2019 季,模式:显示 {series} 的 {year} 季,输出:returns true and [0=>2019, 1=>GOT]
PS:字符串将包含表情符号和 ?,'。
我只是猜测您有几个包含各种组件的句子,并且您希望提取或替换其中的某些所需部分。
您可能希望首先对您的输入进行分类,然后通过一些函数将其传递以进行匹配或替换。这个一般表达式可能没问题,只是看一下你想如何为你的输入设计和编写一些表达式:
play\s+([^,]+?)\s*,|show\s+(.*?)\s+profile|show\s+(\d{4})\s+season\s+of\s+([^,]+?)\s*,|i(?:'m)?\s+.*?(?:\ba\b|\ban\b)\s+(\S+)
如果您可能在某些特定表达式上遇到过一些技术问题,您可以 post 一个一个地解决这些问题,也许有一些真实的输入和期望的输出。
表达式在 regex101.com, if you wish to explore/simplify/modify it, and in this link 的右上面板中进行了解释,如果您愿意,您可以观察它如何与一些示例输入匹配。
测试
$re = '/play\s+([^,]+?)\s*,|show\s+(.*?)\s+profile|show\s+(\d{4})\s+season\s+of\s+([^,]+?)\s*,|i(?:\'m)?\s+.*?(?:\ba\b|\ban\b)\s+(\S+)/mi';
$str = 'play demo-song, pattern: play {song},
show hoizer profile, pattern: show {artist} profile
show 2019 season of GOT, pattern: show {year} season of {series},
PLAY demo-song, pattern: PLay {song},
SHOW hoizer some other artists profile, pattern: show {artist} profile
show 2019 SEASON OF GOT , pattern: show {year} season of {series},
i am a student I AM A programmer i\'m a suergeon pattern: I\'m a {profession}, ';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);
正则表达式电路
jex.im 可视化正则表达式:
到目前为止,这是满足我要求的解决方案。谢谢你的帮助@Emma。
function checkPattern($stringToTest, $pattern) {
str_replace("\|", "|", preg_quote($pattern));
$pattern = str_replace("|", "$|^", preg_replace('/' . preg_quote('{') . '.*?' .preg_quote('}') . '/', '(.*)', $pattern));
$regexMatched = (bool) preg_match("/^".$pattern."$/mi", $stringToTest, $matches);
var_dump([$regexMatched, end($matches)]);
}
//test 1 returns [true, hozier]
$stringToTest = "play songs by hozier";
$pattern = "play songs by {artist}|play {artist} songs|{artist} songs";
checkPattern($stringToTest, $pattern);
//test 2 returns [false, false]
$stringToTest = "show hozier";
$pattern = "show {artist} profile|view {artist} profile";
checkPattern($stringToTest, $pattern);