Когда я прочитал alt (с технической точки зрения) текст этого комикса XKCD , мне стало любопытно, указывают ли все статьи в Википедии на статью по философии. Поэтому я начал создавать веб-приложение, которое отображает, на какие статьи он «указывает», используя PHP.
(PS: не беспокойтесь о трафике - потому что я буду использовать его в частном порядке и не буду отправлять слишком много запросов на сервер Википедии)
Чтобы сделать это, я должен удалить текст между скобками и курсивом и получить первую ссылку. Другие вещи могут быть достигнуты с помощью PHP Simple HTML DOM Parser , но проблема заключается в удалении текста в скобках ..
Если в скобках нет скобок, то я мог бы использовать этот RegEx: \([^\)]+\)
, однако, как и статья о немецком языке , есть некоторые статьи с накладными скобками (например: German (Deutsch [ˈdɔʏtʃ] ( listen)) is..
) и выше RegEx не может обработать эти случаи, так как [^\)]*\)
находит первые закрывающие скобки, а не соответствующие закрывающие скобки. (На самом деле вышеупомянутый случай не становится проблемой, поскольку между двумя закрывающими скобками нет текста, но становится большой проблемой, когда есть связь между двумя закрывающими скобками.)
Одно грязное решение, которое я могу себе представить, это:
$s="content of a wikipedia article";$depth=0;$s2="";
for($i=0;$i<strlen($s);$i++){
$c=substr($s,$i,1);
if($c=='(')$depth++;
if($c==')'){if($depth>0)$depth--;continue;}
if($depth==0) $s2.=$c;
}
$s=$s2;
Однако мне не нравится это решение, поскольку оно разбивает строку на отдельные символы, и это выглядит как ненужное ...
Есть ли другие способы удаления текста в паре (соответствующих) скобок?
Например, я хочу сделать этот текст:
blah(asdf(foo)bar(lol)asdf)blah
в это:
blahblah
но не так:
blahbarasdf)blah
Редактировать: из комментария к ответу Эмиля Викстрёма я понял, что вышеуказанный подход (убрать тексты в скобках) может удалить ссылку, содержащую скобки. Однако мне все еще нужен ответ на вышеуказанную проблему, поскольку я уже сталкивался с подобной проблемой и хочу знать ответ ...
Так что мой вопрос по-прежнему: как убрать текст между соответствующими скобками?