#php #regex
#php #регулярное выражение
Вопрос:
Я использую регулярное выражение для преобразования @user name в ссылки. Например, если пользователь вводит @Alex Ferguson, он должен преобразовать Alex Ferguson в гиперссылку. Здесь это преобразование имени в гиперссылку и исключение фамилии.Он ищет слово ближе к @, если между именем и фамилией нет пробела, оно работает нормально. Есть ли какой-либо способ преобразовать имя и фамилию в гиперссылку.
Вот мой код:
function convert($msg){
$message = preg_replace(array('/(?i)b((?:https?://|wwwd{0,3}[.]|[a-z0-9.-] [.][a-z]{2,4}/)(?:[^s()<>] |(([^s()<>] |(([^s()<>] )))*)) (?:(([^s()<>] |(([^s()<>] )))*)|[^s`!()[]{};:'".,<>?«»“”‘’]))/', '/(^|[^a-z0-9_])@([a-z0-9_] )/i', '/(^|[^a-z0-9_])#([a-z0-9_] )/i'), array('<a href="$1" target="_blank">$1</a>', '$1<a href="">@$2</a>', '$1<a href="index.php?hashtag=$2">#$2</a>'), $msg);
return $message;
}
Спасибо..
Комментарии:
1. Всегда ли есть фамилия? Если нет, то как регулярное выражение должно определять, какие части принадлежат имени пользователя?
2. имя и фамилия обязательны
Ответ №1:
Общий метод для этого будет:
$regex = '~(?i)@[a-z] [ ][a-z] ~';
$replaced = preg_replace($regex,'<a href="">$0</a>',$string);
Примечания
- Я оставлю это для вас, чтобы заполнить пробелы
- Одной из проблем с именами является диапазон допустимых символов. А как насчет Джули О’Хара? M.C. Cocoa? и т.д.
Комментарии:
1. возможно ли выполнить обратный вызов перед преобразованием в ссылки, я хочу проверить, существует ли пользователь в базе данных или нет.
2. Абсолютно!
preg_replace_callback($regex,function($m) {// do whatever you like here, look up etc, then return your replacement or $0 unnchanged },$string);
3. должен ли я использовать preg_replace_callback вместо preg_replace ?
4. Ну да, если вы хотите проверить базу данных и т. Д., Используйте функцию обратного вызова, как я показал вам в комментарии выше. Если вам нужна уверенность, вы можете увидеть то же самое на этой странице руководства , надеюсь, это ответит на ваш вопрос. 🙂
5. Спасибо, рад, что это помогло. 🙂