Для указания двух условий в функции preg_replace вам понадобится использовать обратную ссылку $2 для второго условия. Вот пример кода с двумя условиями для замены:
$text = preg_replace('/\[(.*?)\]/', '<a href="#$1">'.str_replace(' ', '-', '$1').'</a>', $text);
$text = preg_replace('/\[(.*?)\s(.*?)\]/', '<a href="#$1">'.str_replace(' ', '-', '$2').'</a>', $text);
Этот код заменяет все вхождения текста, заключенного в квадратные скобки, на ссылки, добавляя содержимое в качестве якорной ссылки.
В первом выражении регулярного выражения '\[(.*?)\]', мы находим текст, заключенный в квадратные скобки, и используем str_replace для замены пробелов на дефисы.
Во втором выражении '\[(.*?)\s(.*?)\]', мы находим текст, заключенный в квадратные скобки, за которым следует пробел и другой текст, и используем str_replace для замены пробелов на дефисы только для второго найденного текста.
Обратите внимание, что в обоих случаях мы используем $1 внутри функции str_replace, чтобы ссылаться на найденный текст.