Разделение комментариев HTML с PHP, но отъездом условных выражений

Там нет никаких существенных последствий производительности. Даже не думайте рассматривать это как проблему. Для этого требуется огромный антипаттерн ранней оптимизации.

«Должен ли я отмечать в качестве NOT NULL только те столбцы, которые обязательно должны быть заполнены для того, чтобы строка вообще имела какое-либо значение для моего приложения?»

Да. Это так просто. Вам гораздо лучше с NULLable столбцом без каких-либо значений NULL в нем, чем с потребностью в NULL и необходимостью имитировать его. И в любом случае, любые неоднозначные случаи лучше отфильтровывать в ваших бизнес-правилах.


РЕДАКТИРОВАТЬ:

Есть еще один аргумент для пустых полей, который, на мой взгляд, является наиболее убедительным, это аргумент Use Case. Мы все были подвержены формам ввода данных, которые требуют значений для некоторых полей; и мы все отказались от форм, где у нас не было разумных значений для обязательных полей. В конечном счете, приложение, форма и дизайн базы данных могут быть защищены только в том случае, если они отражают требования пользователя; и ясно, что существует множество столбцов базы данных, для которых пользователи не могут представлять никакой ценности - иногда в определенных точках бизнес-процесса, иногда когда-либо.

6
задан Ian 18 June 2009 в 15:51
поделиться

5 ответов

Поскольку комментарии не могут быть вложены в HTML, теоретически регулярное выражение может выполнить эту работу. Тем не менее, использование какого-либо парсера было бы лучшим выбором, особенно если не гарантируется, что ваш ввод будет правильно сформирован.

Вот моя попытка. Чтобы соответствовать только нормальным комментариям, это сработает. Он стал настоящим монстром, извините за это. Я довольно тщательно протестировал его, кажется, он работает хорошо, но я не даю никаких гарантий.

<!--(?!\s*(?:\[if [^\]]+]|<!|>))(?:(?!-->).)*-->

Пояснение:

<!--                #01: "<!--"
(?!                 #02: look-ahead: a position not followed by:
  \s*               #03:   any number of space
  (?:               #04:   non-capturing group, any of:
    \[if [^\]]+]    #05:     "[if ...]"
    |<!             #06:     or "<!"
    |>              #07:     or ">"
  )                 #08:   end non-capturing group
)                   #09: end look-ahead
(?:                 #10: non-capturing group:
  (?!-->)           #11:   a position not followed by "-->"
  .                 #12:   eat the following char, it's part of the comment
)*                  #13: end non-capturing group, repeat
-->                 #14: "-->"

Шаги № 02 и № 11 имеют решающее значение. # 02 гарантирует, что следующие символы не означают условный комментарий. После этого # 11 проверяет, что следующие символы не указывают на конец комментария, в то время как # 12 и # 13 вызывают фактическое совпадение.

Применить с флагами «global» и «dotall».

Чтобы сделать наоборот (совпадать только с условными комментариями), это будет примерно так:

<!(--)?(?=\[)(?:(?!<!\[endif\]\1>).)*<!\[endif\]\1>

Объяснение:

<!                  #01: "<!"
(--)?               #02: two dashes, optional
(?=\[)              #03: a position followed by "["
(?:                 #04: non-capturing group:
  (?!               #05:   a position not followed by
    <!\[endif\]\1>  #06:     "<![endif]>" or "<![endif]-->" (depends on #02)
  )                 #07:   end of look-ahead
  .                 #08:   eat the following char, it's part of the comment
)*                  #09: end of non-capturing group, repeat
<!\[endif\]\1>      #10: "<![endif]>" or "<![endif]-->" (depends on #02)

Снова примените с флагами «global» и «dotall».

Шаг № 02 связан с синтаксисом «обнаружен нижний уровень», см .: «MSDN - Об условных комментариях» .

Я не совсем уверен, где разрешены или ожидаются пробелы. При необходимости добавьте \ s * в выражение.

23
ответ дан 8 December 2019 в 04:09
поделиться

Если вы не можете заставить его работать с одним регулярным выражением или обнаружите, что хотите сохранить больше комментариев, вы можете использовать preg_replace_callback . Затем вы можете определить функцию для обработки комментариев по отдельности.

<?php
function callback($buffer) {
    return preg_replace_callback('/<!--.*-->/U', 'comment_replace_func', $buffer);
}

function comment_replace_func($m) {
    if (preg_match( '/^\<\!--\[if \!/i', $m[0])) {
        return $m[0];   
    }              

    return '';
}   

ob_start("callback");
?>

... HTML source goes here ...

<?php ob_end_flush(); ?>
2
ответ дан 8 December 2019 в 04:09
поделиться

I'm not sure if PHP's regex engine will like the following, but try this pattern:

'/<!--(.|\s)*(\[if .*\]){0}(.|\s)*?-->/'
0
ответ дан 8 December 2019 в 04:09
поделиться

Что-то вроде этого может сработать:

/<!--[^\[](.|\s)*?-->/

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

0
ответ дан 8 December 2019 в 04:09
поделиться

В общем, это кажется лучшим решением:

<?php
  function callback($buffer) {
    return preg_replace('/<!--[^\[](.|\s)*?-->/', '', $buffer);
  }
  ob_start("callback");
?>
... HTML source goes here ...
<?php ob_end_flush(); ?>

Он удаляет все комментирует и оставляет условные выражения, за исключением верхнего:

<!--[if !IE]><!-->
<link rel="stylesheet" href="/css/screen.css" type="text/css" media="screen" />
<!-- <![endif]-->

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

Если бы кто-нибудь мог предложить регулярное выражение, которое учло бы это и оставило бы это условное выражение на месте, то это было бы идеально.

Tomalak '

1
ответ дан 8 December 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: