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

时间:2019-07-19 13:44:05

标签: php regex preg-replace preg-match

我想将第一字符串与第二字符串匹配。第二个字符串将在 {} 中包含动态内容。它也用 | 分隔,因为我需要将第一个字符串与第二个字符串的多个值进行匹配,并返回布尔值。另外,如果第一字符串值与第二字符串的部分值匹配,则需要第一字符串的动态变量。我已经尝试和搜索了很多,然后想到了

$message = "wala hi";
$pattern = "Mujhey|mujhe|mujh'y|mjy?|mujy|wala {dynamicontent}";
$pattern = str_replace('/', '\/', $pattern);
$text = '/^'.preg_replace('/\{((?:(?!\d+,?\d+?)\w)+?)\}/', '(?<$1>.*)', $pattern).' ?$/miu';
$regexMatched = (bool) preg_match($text, $message, $matches) || (bool) preg_match($text, '', $matches);
var_dump([$regexMatched, $matches]);

它仍然无法正常工作。

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

  1. 输入:播放演示歌曲,模式:播放{歌曲},输出:返回true和演示歌曲
  2. 输入:pley demo-song,模式:播放{song},输出:返回false和null
  3. 输入:显示提升器配置文件,模式:显示{artist}配置文件,输出:返回true和提升器
  4. 输入:显示GOT的2019季节,模式:显示{series}的{year}季节,输出:返回true,[0 => 2019,1 => GOT]

PS:字符串还将包含表情符号和?'

2 个答案:

答案 0 :(得分:1)

到目前为止,这是可以满足我要求的解决方案。谢谢您对@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);

答案 1 :(得分:0)

我只是猜测您有包含不同组成部分的几个句子,并且您希望提取或替换其中的某些所需部分。


您可能希望先对输入进行分类,然后再通过一些函数传递它们以进行匹配或替换。只需看一看,看看您想如何设计和编写一些用于输入的表达式,就可以使用该一般表达式:

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+)

如果您可能在某些特定表达式上遇到了技术问题,则可以将它们与实际输入和所需输出一一发布。


该表达式在regex101.com的右上角进行了解释,如果您想探索/简化/修改它,在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);

RegEx电路

jex.im可视化正则表达式:

enter image description here