$text = 'Уже наступило лето , а скоро наступит осень';
$tegs = 'Выводим хештег [keyText]#лето|лето,летний[/keyText] и еще текст [keyText]любой текст|слово1,слово2[/keyText]';
function getTags($tagsStr, $before='[keyText]', $after='[/keyText]')
{
$posStart = 0;
$posEnd = 0;
$tags = [];
while($posStart < mb_strlen($tagsStr)) {
$posStart = mb_strpos($tagsStr, $before, $posStart);
if($posStart === false) {
break;
}
$posEnd = mb_strpos($tagsStr, $after, $posStart);
if($posEnd === false) {
break;
}
$tagLine = mb_substr($tagsStr, $posStart + mb_strlen($before), $posEnd - $posStart - mb_strlen($before));
if(mb_strpos($tagLine, '|') !== false) {
[$tag, $tagWordsAsStr] = explode('|', $tagLine);
$tagWords = array_unique(array_filter(array_map('trim', explode(',', $tagWordsAsStr))));
if($tagWords) {
$tags[$tag] = ['words' => $tagWords, 'text' => sprintf('%s%s%s', $before, $tagLine, $after)];
}
}
$posStart = $posEnd + 1;
}
return $tags;
}
$textAsWords = array_map('mb_strtolower', array_unique(preg_split('/[\.\s,!()]+/u', $text)));
foreach (getTags($tegs) as $tagKey => $tag) {
$tagFounded = false;
foreach ($tag['words'] as $word) {
if(in_array($word, $textAsWords)) {
$tagFounded = true;
break;
}
}
$tegs = str_replace($tag['text'], $tagFounded ? $tagKey : '', $tegs);
}
print_r($tegs);
replacement может содержать ссылки вида \n, либо $n, причем последний вариант предпочтительней. Каждая такая ссылка будет заменена на подстроку, соответствующую n-ой подмаске. n может принимать значения от 0 до 99, причем ссылка \0 (либо $0) соответствует вхождению всего шаблона. Подмаски нумеруются слева направо, начиная с единицы.
()
- это подмаска, на которую в дальнейшем можно ссылаться (номер подмаски: 1, т.к. идет первой). Соответственно во втором параметре preg_replace просто указывается ссылка на эту подмаску - $1. Вместо $1 при замене подставится найденный тег. foreach($specsCatId as $sci)
{
$allSpecCat = [
'blog_cat_id' => $sci->id,
];
var_dump($allSpecCat);
}
print(lines)
можно проверить с помощью any():sub_string = 'test'
print(any([sub_string not in l for l in lines]))
preg_replace('/[\(+\/\\\\]?(\d[+\(\)\/\\\\ -]*){10,11}/', ' *** ' , $text);
\\\\
\
и /
(их нужно обязательно экранировать) в регулярное выражение:[\(+\/\\]?(\d[+\(\)\/\\ -]*){10,11}