Regex с C# на PHP

У меня этот код работает с C#.

var phrase = "// Hi++    My name's Jon'ss and .. ''c and d''ef.";
            var phraseCompressed = string.Empty;

            var wordRegex = new Regex(@"(\W*)(\w+)(\W*)", RegexOptions.IgnoreCase);
            var matches = wordRegex.Matches(phrase);

            foreach (Match match in matches)
            {
                phraseCompressed += match.Groups[1].Value;
                phraseCompressed += "<" + match.Groups[2].Value + ">";
                phraseCompressed += match.Groups[3].Value;
            }

            Console.WriteLine("Input  : " + phrase);
            Console.WriteLine("Output : " + phraseCompressed);
            Console.ReadLine();

Прошу помощи в переводе этого кода на PHP.

Кажется, что Regex в PHP и C# - это не одно и то же.

Вот черновик решения (не работающего):

$phrase = "// Hi++ My name's Jon'ss and .. ''c and d''ef.";
$phraseCompressed = "";
preg_match("/(.*)(w+)(.*)/", $phrase, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

Я предполагаю, что мое регулярное выражение не в порядке в PHP.

Ожидаемый результат:

Input : // Hi++    My name's Jon'ss and .. ''c and d''ef.
Output : // <Hi>++  <My> <name>'<s> <Jon>'<ss> <and> .. ''<c> <and> <d>''<ef>.

Наилучшие пожелания,

Во-первых, .* - это не то же самое, что \W*. Кроме того, \W в регулярном выражении C# аналогичен (но не равен) /\W*/u в PHP (он поддерживает Unicode по умолчанию в регулярном выражении .NET). Обратите внимание, что RegexOptions.IgnoreCase является избыточным, \w соответствует как строчным, так и прописным буквам. То же самое и с \w. Кажется, вы хотите использовать preg_replace('~\w+~u', '<$0>', $phrase)

Wiktor Stribiżew 02.07.2018 13:51

Почему вы не используете то же регулярное выражение?

revo 02.07.2018 13:52

Я пробовал, но то же регулярное выражение не работает или, может быть, я неправильно использую PHP

Thogerar 02.07.2018 13:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы неправильно построили свое регулярное выражение. w+ не был бы равен \w+. Первый соответствует одному или нескольким вхождениям буквы w, а второй соответствует символам слова.

У вас также есть цикл foreach в вашем коде C#, но он пропущен в PHP. Кроме того, preg_match возвращает одно совпадение, а preg_match_all возвращает все. Лучше попробуйте с preg_replace:

echo preg_replace('/\w+/', '<$0>', $phrase);
# // <Hi>++ <My> <name>'<s> <Jon>'<ss> <and> .. ''<c> <and> <d>''<ef>.

Живая демонстрация PHP

Другие вопросы по теме