将字符串与另一个具有动态字符串内容的字符串匹配

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]);

它仍然无法正常工作。

以下可以是输入、要匹配的模式 = 和所需的输出:

  1. 输入:播放演示歌曲,模式:播放{song},输出:returns true and demo-song
  2. 输入:播放演示歌曲,模式:播放{歌曲},输出:returns false and null
  3. 输入:显示 hoizer 个人资料,模式:显示 {artist} 个人资料,输出:returns true and hoizer
  4. 输入:显示 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);