AutoLinkがマルチバイトとASCIIコードとでコンフリクトする場合がある paraedit

  • ページ: Develop/Modification1
  • 投稿者: ぃぉぃぉ
  • 優先順位: 低
  • 状態: 保留
  • カテゴリー: 本体バグ
  • 投稿日: 2008-03-07 (金) 17:30:56
  • バージョン:

メッセージ paraedit

AutoLinkがマルチバイトとASCIIコードとでコンフリクトする場合がある。

関連情報 paraedit

対策案1(NG) paraedit

preg_matchを、次のようなmb_preg_matchに置き換えるとよいのでは。

http://jp.php.net/preg_match

function mb_preg_match($ps_pattern, $ps_subject, &$pa_matches, $pn_flags = NULL, $pn_offset = 0, $ps_encoding = NULL) {
  // WARNING! - All this function does is to correct offsets, nothing else:
  //
  if (is_null($ps_encoding))
    $ps_encoding = mb_internal_encoding();
 
  $pn_offset = strlen(mb_substr($ps_subject, 0, $pn_offset, $ps_encoding));
  $ret = preg_match($ps_pattern, $ps_subject, $pa_matches, $pn_flags, $pn_offset);
 
  if ($ret && ($pn_flags & PREG_OFFSET_CAPTURE))
    foreach($pa_matches as &$ha_subpattern)
      $ha_subpattern[1] = mb_strlen(substr($ps_subject, 0, $ha_subpattern[1]), $ps_encoding);
 
  return $ret;
  } 

だめだった。ここじゃないな。

対策案2(NG)(近づいた) paraedit

autolinkを生成しているのは、make_linkのBody->convertのpreg_replace_callback。

このpreg_replace_callbackがmbに対応していないのが原因。

-		$string = preg_replace_callback('/' . $this->pattern . '/x',
-			array(& $this, 'replace'), $string);
+		$string = mb_ereg($string, $this->pattern) ?
+			preg_replace_callback('/' . $this->pattern . '/x',
+								  array(& $this, 'replace'), $string) : $string;

mb_eregだと正規表現に互換性がなさそう。

対策案3(改善策) paraedit

  • とりあえずこのサイトには導入しています。 どうなるかというと、こちら。呂后
  • lib/make_link.php InlineConverterのreplaceにてautolink等の置換をしている。
  • class InlineConverter
    • class InlineConverter
      class InlineConverter
      {
      	var $converters; // as array()
      	var $pattern;
      	var $pos;
      	var $result;
      +	var $string;
      
    • function convert()
      	function convert($string, $page)
      	{
      		$this->page   = $page;
      		$this->result = array();
      +		$this->string = $string;
      
    • function replace()
      	function replace($arr)
      	{
      +		if (mb_strpos($this->string, $arr[0]) === FALSE) {
      +			return make_line_rules(htmlspecialchars($arr[0]));
      +		}
       
      		$obj = $this->get_converter($arr);
       
      		$this->result[] = ($obj !== NULL && $obj->set($arr, $this->page) !== FALSE) ?
      			$obj->toString() : make_line_rules(htmlspecialchars($arr[0]));
       
      		return "\x08"; // Add a mark into latest processed part
      	}
      これで、誤って検出される単語のみがある行は、解決される。
      しかし、同じ行に本当にAutolinkされる単語もある行は、化けてしまう。

うーん、autolinkは正規表現を使わずに、ページ名一覧のmb_strposあたりで全ページ名を検索するとかかなぁ。




トップ 編集凍結差分バックアップ添付複製名前変更リロード 新規一覧 単語検索 最終更新  ヘルプ  最終更新のRSS
Last-modified: 2008-03-13 (木) 01:42:00 (4610d)