Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Поиск битых ссылок


Автор: feosr 12.6.2008, 15:56
Как бы задача в следующем:

из таблицы pfx_temp_pages выводится контент. Навигация по статьям проихходит по заголовку статьи (по принцыпу WIKI систем). Требуется проверка ссылок на странице. Например если ссылка ведет на статью которой нету, то к ссылке добавляется act=edit скажем. Вопрос, как это сделать??

у меня уже есть наработка, но оно как бы сказать.. незнаю...
я беру из базы статью, затем получаю собственно желаемый текст где все ссылки на статьи внутри сайта вида [[Статья]]. Затем припомощи цикла и preg_match я получаю заголовок страницы из базы (тобиш получается второй запрос + фетч_акос) и затем проверяю на предмет есть ли ссылка на такую статью...

но этот способ мне кажется нелогичным... может кто подскажет как лучше сделать?

Автор: Pokoinik 12.6.2008, 17:51
feosr, а зачем это делать?
может будет проще, при открытии статьи, которой нету, сразу открывать контрол добавления статьи, а не насиловать сервер обработкой больших объемов данных при просмотре каждой статьи?

Автор: feosr 12.6.2008, 18:07
Собственно это просто прихоть)) понравилось реализация в MediaWIKI и просто для собственного рзвития сделать нечто подобное))

p.s. В медиавики непонятная реализация какая-то

Автор: krundetz 12.6.2008, 21:37
Может лучше организовать так есть база таблица сушествующих ссылок при переходе по ней происходит запрос к ней чтобы выдать контент если его нет то страница создается автоматически и предлагается её заполнит. Если понравилась реализация в WediaWiki может стоит посмотреть как это сделано там, припятствий ведь ни каких нет.

Автор: feosr 21.8.2008, 22:44
У меня вопрос, почему неработает??

Код

$titles = mysql_query("SELECT title FROM dle_wikip");
$i = 1;
$titlearray = array();
while($row = $db->mysql_fetch_array($titles)){
    $titlearray[$i] = $row[0];
    $i++;
}

$text = 'Welcome! Use uhh hjgk gikjhgu klug or somethink [[Else|ElSe]]. [[Welcome_page_24|Kampai!]]!!!';

$text = preg_replace( "#\[\[(.+?)\|(.+?)\]\]#is"  , linker("\\1", "\\2"), $text );


function linker($lnk, $alt){
global $titlearray;
    if(in_array("{$lnk}", $titlearray)){
        return '<a href="'.$lnk.'">'.$alt.'</a>';
    }
    else{
        return '<a href="'.$lnk.'" style="color:#ff0000;">'.$alt.'</a>';
    }
}

echo $text;


Как результат выводит это:
Код

Welcome! Use uhh hjgk gikjhgu klug or somethink <a href="Else" style="color:#ff0000;">ElSe</a>. <a href="Welcome_page_24" style="color:#ff0000;">Kampai!</a>!!!


Я так понял что в функцию in_array эта переменная неидет так как если выводить ее чезер echo то выводиться \1

Если кто может помочь.... Массив для проверки вот такой:
Код

Array
(
    [1] => Welcome_page_1
    [2] => Welcome_page_2
    [3] => Welcome_page_3
    [4] => Welcome_page_4
    [5] => Welcome_page_5
    [6] => Welcome_page_6
    [7] => Welcome_page_7
    [8] => Welcome_page_8
    [9] => Welcome_page_9
    [10] => Welcome_page_10
    [11] => Welcome_page_11
    [12] => Welcome_page_12
    [13] => Welcome_page_13
    [14] => Welcome_page_14
    [15] => Welcome_page_15
    [16] => Welcome_page_16
    [17] => Welcome_page_17
    [18] => Welcome_page_18
    [19] => Welcome_page_19
    [20] => Welcome_page_20
    [21] => Welcome_page_21
    [22] => Welcome_page_22
    [23] => Welcome_page_23
    [24] => Welcome_page_24
    [25] => Welcome_page_25
    [26] => Welcome_page_26
    [27] => Welcome_page_27
    [28] => Welcome_page_28
    [29] => Welcome_page_29
    [30] => Welcome_page_30
    [31] => Welcome_page_31
    [32] => Welcome_page_32
    [33] => Welcome_page_33
    [34] => Welcome_page_34
    [35] => Welcome_page_35
    [36] => Welcome_page_36
    [37] => Welcome_page_37
    [38] => Welcome_page_38
    [39] => Welcome_page_39
    [40] => Welcome_page_40
    [41] => Welcome_page_41
    [42] => Welcome_page_42
    [43] => Welcome_page_43
    [44] => Welcome_page_44
    [45] => Welcome_page_45
    [46] => Welcome_page_46
    [47] => Welcome_page_47
    [48] => Welcome_page_48
    [49] => Welcome_page_49
    [50] => Welcome_page_50
    [51] => Welcome_page_51
    [52] => Welcome_page_52
    [53] => Welcome_page_53
    [54] => Welcome_page_54
    [55] => Welcome_page_55
    [56] => Welcome_page_56
    [57] => Welcome_page_57
    [58] => Welcome_page_58
    [59] => Welcome_page_59
    [60] => Welcome_page_60
    [61] => Welcome_page_61
    [62] => Welcome_page_62
    [63] => Welcome_page_63
    [64] => Welcome_page_64
    [65] => Welcome_page_65
    [66] => Welcome_page_66
    [67] => Welcome_page_67
    [68] => Welcome_page_68
    [69] => Welcome_page_69
    [70] => Welcome_page_70
    [71] => Welcome_page_71
    [72] => Welcome_page_72
    [73] => Welcome_page_73
    [74] => Welcome_page_74
    [75] => Welcome_page_75
    [76] => Welcome_page_76
    [77] => Welcome_page_77
    [78] => Welcome_page_78
    [79] => Welcome_page_79
    [80] => Welcome_page_80
    [81] => Welcome_page_81
    [82] => Welcome_page_82
    [83] => Welcome_page_83
    [84] => Welcome_page_84
    [85] => Welcome_page_85
    [86] => Welcome_page_86
    [87] => Welcome_page_87
    [88] => Welcome_page_88
    [89] => Welcome_page_89
    [90] => Welcome_page_90
    [91] => Welcome_page_91
    [92] => Welcome_page_92
    [93] => Welcome_page_93
    [94] => Welcome_page_94
    [95] => Welcome_page_95
    [96] => Welcome_page_96
    [97] => Welcome_page_97
    [98] => Welcome_page_98
    [99] => Welcome_page_99
    [100] => Welcome_page_100
)

Автор: Sannis 21.8.2008, 23:00
Прочитайте в мане по preg_peplace про модификатор "e". А в приведённом вам виде код имхо не должен работать.

Добавлено через 1 минуту и 17 секунд
Т.е. он-то работает, только посмотрите внимательно на вызов preg_peplace и попробуйте выступить в роли интерпретатора.

Автор: feosr 22.8.2008, 07:59
Огромное спасибо)
Код

$text = preg_replace( "#\[\[(.+?)\|(.+?)\]\]#is e"  , 'linker("\\1", "\\2")', $text );

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)