Как стать автором
Обновить

Комментарии 20

Я говорю: «уместнее», а не «более высокая производительность», потому что в этом примере, где мы работаем с крошечной строкой электронной почты.

Извините, но перевод ужасен.
Да, в оригинале было «better practice», мне показалось наоборот, так легче будет читаться. Опыт, сын ошибок трудных.
Перестал читать после первого примера, видимо как автор, так и переводчик плохо знают как PHP так и регулярные выражения.

Я просто оставлю это тут.
$s[0] = $s[0]=='@' ? '#' : $s[0];

А второй пример просто убил.
Немного дополню свой комментарий, а то, как-то сердито вышло.
Итак:
Приводя перевод, автор перевода, как-бы, поддерживает точку зрения автора оригинального текста, так что я буду обращаться к обоим.

К сожалению, некоторые разработчики не поняли, что это означает, а просто решили что регулярные выражения ужасны не производительны и что они должны любой ценой избежать регулярных выражений.

Регулярные выражения действительно очень медленные. И если Вы используете их в высоконагруженных проектах, то Вы существенно замедляете работу выполнения. Да что там говорить, даже при простом парсинге, регулярки зачастую уступают по скорости другим методам.

Регулярные выражения являются мощным инструментом.

Только в том случае где это действительно необходимо. А при хорошем знании других подходов они становятся исключительным методом разбора строк.

Например, скажем, вы хотите проверить адрес электронной почты, просто проверив символ @.

Я бы не был на столько доверчивым. (регулярка для проверки адреса электронной почты)

Тогда наш строками кода становится более сложной и менее читается

Это что? Взорвался мозги мой, стена, стул, стол кровь текут рекой. И это не единственное место оставленно после гугл транслейта без правок.

И еще. Даже не смотря на то, то автор оригинальной статьи «is founder of Delicious Brains, a company building super awesome products for WordPress, including WP Migrate DB Pro, a huge time saving tool for WordPress developers», не стоит доверять всем и каждому в их суждениях. Особенно, когда человек пишет вот такое:

$length = strlen( $string );
if ( 0 === strpos( $string, '@' ) && $length - 1 === strrpos( $string, '@' ) ) {
    $string = '#' . substr( $string, 1, $length - 1 ) . '#';
}


Вместо вот такого:

if ($s[0]=='@' && $s[strlen($s)-1]=='@') { $s[0]='#'; $s[strlen($s)-1]='#'; }
Вы правы, к статье я не отнесся критически, да и мой опыт этого бы не позволил. Просто в чем-то ход мыслей автора совпал с моими.
Тогда уж:
$s[0].substr($s, -1) == '@@'
:)
В идеале надо бы как-то так :)
$s[0].$s[-1] == '@@'

Разработчикам PHP давно пора было сделать как в языке D: s[$ — 1], где знак доллара мета-обозначение последнего элемента, по сути сахар к s.length — 1.
Тогда уж можно убрать кавычки

if ($s[0].substr($s, -1) == '@@') $s[0]=$s[strlen($s)-1]='#';
оба вы не правы:

if (substr($string, 0, 1) == '@' && substr($string, -1) == '@') {
	$string = '#' . substr($string, 1, strlen($string) - 2) . '#';
}


:)
Например тем, что он прекрасно отформатирован.

На самом деле мой код лучше, потому что в меньшей степени не опирается на внутреннее представления данных интерпретатором.

Я на php не пишу, но тем не менее в курсе насчет mb_string и то, что мой пример тоже не будет работать с мультибайт строками, не является для меня секретом.

Но мой вариант, в случае необходимости, можно легко исправить — а ваш придется переписывать заново.

Кроме того, не будем забывать про портируемость…
P.S.
Но если говорить строго, код в статье лучше, так как очевидно быстрее.
С другой стороны, мой вариант немного читабельнее.
Полностью согдасен с обоими доводами, но тут есть одно «но».

Смотря где использовать и для чего.
Если для себя накидать на один раз, то мой вариант быстрее в плане, банально, набора текста.
Если для большого проекта который покрывается тестами, то Ваш вариант конечно лучше.

Однако в статье делается упор на то, что регулярки изящнее, и короче, поэтому я и привел этот пример исключительно в академических целях. Ни в коем случае я не настаиваю на том, что только так и надо писать.
В вопросах «накидать на один раз» как раз регулярки нагляднее и набирать быстрее, разве нет?
Если регулярно их используешь, а не лезешь за каждым чихом в мануал.
«это более удобно для чтения тем, кто имеет власть на регулярные выражения» — you have no power over me!©regexp
— Если вы разрабатываете в Perl, PHP, Python, Ruby, JavaScript (или любом другом языке с поддержкой регулярных выражения) и не знаете регулярные выражения…
… то вы еще не программист
«Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.»
Проблема регулярных выражений в том, что их легко писать, но мучительно сложно читать.

Так что если вы используете в коде скольк-нибудь сложный регексп, обязательно сопровождайте его комментарием о том, что он делает.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации