Регулярные выражения жадные по умолчанию (по крайней мере, PCRE). Обычно вы можете обойти это:
/a+/ # selects the whiole string from "aaaaaaa"
/a+?/ # selects only "a"
В вашем случае это мало поможет, так как вы не можете просто вставить знак вопроса где-нибудь. Единственная возможность - изменить порядок вашего поискового массива и мгновенно заменить найденных мест. Найдите first для s:10
и second для s:1
и используйте preg_replace () вместо сопоставления. Таким образом, второй больше не находит первый.
Другая возможность: Разделить ваш поисковый массив на две части. Если вы знаете, что он всегда имеет структуру «:» плюс цифры, вы можете получить регулярное выражение в этом втором цикле, например
Preg_Match_All ( '/' . Preg_Quote ( $smilie ) . '(?![0-9])/i', $Content, $matches );
с (?![0-9])
a выражением «смотреть вперед» ищет любой не -знач.
И третий: Если вы разрешаете (== конвертировать) смайлики только в определенных местах, вы можете использовать это:
Preg_Match_All ( '/\b' . Preg_Quote ( $smilie ) . '\b/i', $Content, $matches );
\b
- это «граница слова», обычно любая не- (буква, цифра, подчеркивание). Недостатком является то, что не все смайлики (например, "abc ;-) xyz") будут найдены.