У меня этот код работает с 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>.
Наилучшие пожелания,
Почему вы не используете то же регулярное выражение?
Я пробовал, но то же регулярное выражение не работает или, может быть, я неправильно использую PHP






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