PHP имеет дело с огромной строкой - PullRequest
0 голосов
/ 24 мая 2011

Я должен заменить xmlns на ns в своем поступающем xml, чтобы исправить функцию SimpleXMLElements xpath ().Большинство функций не имеют проблем с производительностью.Но, похоже, что при росте строки всегда возникают накладные расходы.

Например, preg_replace для строки размером 2 МБ требуется 50 мс для обработки, даже если я ограничиваю замены до 1замена выполняется в самом начале.

Если я substr наберу первые несколько символов и просто заменю эту часть, то это будет немного быстрее.Но не совсем то, что я хочу.

Есть ли какой-нибудь метод PHP, который бы работал лучше в моей проблеме?И если нет никакой опции, может ли помочь простое расширение php, которое просто заменяет => SimpleXMLElement в C?

Ответы [ 4 ]

2 голосов
/ 24 мая 2011

Если вы точно знаете, где находятся оскорбительные «x», «m» и «l», вы можете просто использовать что-то вроде $xml[$x_pos] = ' '; $xml[$m_pos] = ' '; $xml[$l_pos] = ' ', чтобы преобразовать их в пробелы.Или преобразовать их в ns___ (где _ = пробел).

0 голосов
/ 24 мая 2011

50мс звучит довольно разумно для меня, как-то так. Само требование пахнет чем-то не так.

Есть ли какая-то особая причина, по которой вы используете регулярные выражения? Почему люди продолжают переходить к решению регулярных выражений overkill?

Существует стандартная функция замены строк, называемая str_replace, которая может делать то, что вы хотите, в кратчайшие сроки (хотя, подходит ли это вам, зависит от сложности поиска / замены).

0 голосов
/ 24 мая 2011

Из исходного кода PHP, как мы видим, например, здесь: http://svn.php.net/repository/php/php-src/branches/PHP_5_2/ext/standard/string.c

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

Только если мы в беде Попробуйте изобрести здесь колесо str_replace с помощью строковой обработки символов. Например, у нас есть строка $somestring = "somevalue". В PHP мы могли работать с его символами по индексам как echo $somestring{0}, что даст нам «s» или echo $somestring{2}, что даст нам «m». Я не уверен в этом, но возможно, если в официальных имплиментациях ссылки не используются, как они должны использовать.

0 голосов
/ 24 мая 2011

При попытке сделать это всегда возникают накладные расходы - вы имеете дело с массивом char и пытаетесь заменить несколько совпадающих элементов массива (т. Е. Слова).

50 мс - это не слишком много служебной информации, если (как я подозреваю) вы не пытаетесь сделать это в цикле?

...