Сценарии оболочки для выполнения сопоставления / замены регулярных выражений - PullRequest
0 голосов
/ 10 июня 2010

Я использую cURL, чтобы получить веб-страницу и представить ее нашим пользователям.Все работало хорошо, пока я не наткнулся на веб-сайт, использующий значительное количество Ajax, отформатированный так:

33687|updatePanel|ctl00_SiteContentPlaceHolder_FormView1_upnlOTHER_NATL|
                                        <div id="ctl00_SiteContentPlaceHolder_FormView1_othernationalities">
                                            <h4>

                                                <span class="tooltip_text" onmousemove="widetip=false; tip=''; delayToolTip(event,tip,widetip,0,0);return false"
                                                    onmouseout="hideToolTip()">
                                                    <span id="ctl00_SiteContentPlaceHolder_FormView1_lblProvideOTHER_NATL">Provide the following information:</span></span>
                                            </h4>
|
266|scriptBlock|ScriptContentNoTags|
    document.getElementById('ctl00_SiteContentPlaceHolder_FormView1_dtlOTHER_NATL_ctl00_csvOTHER_NATL').dispose = function() {
        Array.remove(Page_Validators, document.getElementById('ctl00_SiteContentPlaceHolder_FormView1_dtlOTHER_NATL_ctl00_csvOTHER_NATL'));
    }

Итак, каждая часть ответа состоит из 4 частей: 2 и 3 - просто идентификаторы, 4 - реальное«тело», а 1 - длина тела.Проблема в том, что мы модифицируем тело, и мне нужно иметь возможность обновить длину первой части, чтобы указать это;в противном случае мы добавляем ошибку разбора при вставке этого в веб-страницу.

Я пытаюсь выяснить комбинацию команд оболочки (awk, sed, что угодно), чтобы: a) прочитать сохраненный файл b)запустите для этого регулярное выражение, чтобы собрать каждый отдельный блок информации (используя '(\ d *?) \ | (. ?) \ | (. ?) \ | (. *?) \ |') c) сделать первую группу захвата равной длине последней группы захвата d) сохранить все совпадения с регулярным выражением в новом документе или обратно в исходный

Любые входные данные из "коллектива" будут с благодарностью приняты.

1 Ответ

1 голос
/ 10 июня 2010

Не похоже, что одна строка RegEx решит эту проблему, так как нет способа поместить первую захваченную скобку между {фигурными скобками} для указания длины Вот что я думаю было бы идеально:

(\d*?)\|([^|]+)\|([^|]+)\|(.{\1})\|

Это значение также нельзя обойти, потому что в случае наличия символа | где-то в теле сообщения. Я предлагаю прямое разделение на '|' и использование двумерного массива для хранения контента. Проверьте каждый четвертый элемент на совпадение длины и, если он слишком короткий, объедините | и следующий элемент, затем увеличьте счетчик чтения. PHP объяснит:

$items=explode('|', $file)
$len=count($items);
$oi=0;
$ol=-1;
for($i=0;$i<$count;++$i){
  $output[$oi][++$ol]=$items[$i];
  if($ol==3){
    $target=$output[$oi][0];
    while(strlen($output[$oi][3])<$target){
      $output[$oi][3].='|'.$items[++$i];
    }
    ++$oi;
    $ol=-1;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...