2014-01-07 2 views
2

Есть ли способ сделать этот кусок кода более эффективным? Я не ищу кого-то, чтобы написать свой код для меня, просто мне точку в правильном направлении ...Эффективная замена строк в PHP

$string = preg_replace('/<ref[^>]*>([\s\S]*?)<\/ref[^>]*>/', '', $string); 
    $string = preg_replace('/{{(.*?)\}}/s', '', $string); 
    $string = preg_replace('/File:(.*?)\\n/s', '', $string); 
    $string = preg_replace('/==(.*?)\=\\n/s', '', $string);   
    $string = str_replace('|', '/', $string); 
    $string = str_replace('[[', '', $string); 
    $string = str_replace(']]', '', $string); 
    $string = strip_tags($string); 

Загвоздка, однако, заключается в том, что замена должна произойти в таком порядке ...

Пример ввод текст:

===API sharing and reuse via virtual machine=== 
{{Expand section|date=December 2013}} 

Some languages like those running in a [[virtual machine]] (e.g. [[List of CLI languages|.NET CLI compliant languages]] in the [[Common Language Runtime]] (CLR), and [[List of JVM languages|JVM compliant languages]] in the [[Java Virtual Machine]]) can share an API. In this case, a virtual machine enables [[language interoperability]], by abstracting a programming language using an intermediate [[bytecode]] and its [[language binding]]s.==Web APIs== 
{{Main|Web API}} 
When used in the context of [[web development]], an API is typically defined as a set of [[Hypertext Transfer Protocol]] (HTTP) request messages, along with a definition of the structure of response messages, which is usually in an Extensible Markup Language ([[XML]]) or JavaScript Object Notation ([[JSON]]) format. While "web API" historically has been virtually synonymous for [[web service]], the recent trend (so-called [[Web 2.0]]) has been moving away from Simple Object Access Protocol ([[SOAP]]) based web services and [[service-oriented architecture]] (SOA) towards more direct [[representational state transfer]] (REST) style [[web resource]]s and [[resource-oriented architecture]] (ROA).<ref> 
{{cite web 
|first  = Djamal 
|last  = Benslimane 
|coauthors = Schahram Dustdar, and Amit Sheth 
|title  = Services Mashups: The New Generation of Web Applications 
|url   = http://dsonline.computer.org/portal/site/dsonline/menuitem.9ed3d9924aeb0dcd82ccc6716bbe36ec/index.jsp?&pName=dso_level1&path=dsonline/2008/09&file=w5gei.xml&xsl=article.xsl 
|work  = IEEE Internet Computing, vol. 12, no. 5 
|publisher = Institute of Electrical and Electronics Engineers 
|pages  = 13–15 
|year  = 2008 
}} 
</ref> Part of this trend is related to the [[Semantic Web]] movement toward [[Resource Description Framework]] (RDF), a concept to promote web-based [[ontology engineering]] technologies. Web APIs allow the combination of multiple APIs into new applications known as [[mashup (web application hybrid)|mashup]]s.<ref> 
{{citation 
|first  = James 
|last  = Niccolai 
|title  = So What Is an Enterprise Mashup, Anyway? 
|url   = http://www.pcworld.com/businesscenter/article/145039/so_what_is_an_enterprise_mashup_anyway.html 
|work  = [[PC World (magazine)|PC World]] 
|date  = 2008-04-23 
}}</ref> 

Пример вывод (с текущим скриптом):

Some languages like those running in a virtual machine (e.g. List of CLI languages/.NET CLI compliant languages in the Common Language Runtime (CLR), and List of JVM languages/JVM compliant languages in the Java Virtual Machine) can share an API. In this case, a virtual machine enables language interoperability, by abstracting a programming language using an intermediate bytecode and its language bindings. 
When used in the context of web development, an API is typically defined as a set of Hypertext Transfer Protocol (HTTP) request messages, along with a definition of the structure of response messages, which is usually in an Extensible Markup Language (XML) or JavaScript Object Notation (JSON) format. While "web API" historically has been virtually synonymous for web service, the recent trend (so-called Web 2.0) has been moving away from Simple Object Access Protocol (SOAP) based web services and service-oriented architecture (SOA) towards more direct representational state transfer (REST) style web resources and resource-oriented architecture (ROA). Part of this trend is related to the Semantic Web movement toward Resource Description Framework (RDF), a concept to promote web-based ontology engineering technologies. Web APIs allow the combination of multiple APIs into new applications known as mashup (web application hybrid)/mashups. 
+3

Возможно, выбор входных данных и выборки результатов будет полезен, поэтому мы можем предложить совершенно другой подход ...?! – deceze

+0

Несомненно! Редактирование почты теперь ... –

+2

Вы можете написать все эти шаблоны в массив и иметь один вызов preg_replace для упрощения кода. То же самое с str_replace. Помимо этого, какие конкретные проблемы у вас есть, чтобы сделать его более «эффективным». Что заставляет вас думать, что это не самое «эффективное» решение? Вы проводили бенчмаркинг? –

ответ

2

с вы только удаляете вещи из своей строки (т. у вас всегда один и тот же шаблон замены), вы можете поместить все в одно preg_replace. Таким образом, вы будете разбирать строку только один раз.

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

пример:

$str = preg_replace('~{{(?>[^}]++|}(?!}))*+}}|\||\[\[|]]~', '', $str); 

заменит вторую линию и три str_replace

детали:

~   # pattern delimiter 
{{   # literal: {{ 
(?>   # open an atomic group (no backtracking inside, make the pattern fail faster) 
    [^}]++ # all characters except } one or more times (possessive: same thing than atomic grouping) 
    |   # OR 
    }(?!}) # a } not followed by } 
)*+   # repeat the atomic group zero or more time (possessive) 
}}   # literal: }} 
|   # OR 
\|   # literal: | 
|   # OR 
\[\[   # literal: [[ 
|   # OR 
]]   # literal: ]] 
~   # pattern delimiter 

Вам сейчас нужно только добавить подшаблоне 1,3,4 к этому шаблон таким же образом. Обратите внимание, что вам не нужен модификатор s, поскольку он никогда не использует точку.

О strip_tags:

Вы можете попробовать использовать подшаблона тоже:

$str = preg_replace('~<[^>]++>~', '', $str); 

Но будьте осторожны с этим, потому что ваш код может содержит несколько ловушек, пример:

blah blah blah <!-- blah > --> blah blah 
or 
<div theuglyattribute=">"> 

It можно избежать всех этих проблем, но ваш шаблон станет очень длинным.

+0

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

+1

@tenub Я не думаю, что это должна быть проблема, из шаблонов, используемых OP. Может быть, может быть не более 2 отдельных замен, а вторая для замены '|' на '/'. – Jerry

+0

@tenub: Я не думаю, что это проблема, но если вы боитесь этого, вы можете сделать это с тем же порядком. –

Смежные вопросы