
圖 1:狀態機圖
private void getA()
{
char[] buffer = new char[1024];
int state = 0;
String a = "";
while (!sr.EndOfStream)
{
int n = sr.Read(buffer, 0, buffer.Length);
for (int i = 0; i < n; i++)
{
switch (state)
{
case 0:
if (buffer[i] == '<') { a += buffer[i]; state = 1; }
break;
case 1:
if (buffer[i] == 'a' || buffer[i] == 'A') { a += buffer[i]; state = 2; }
else { a = ""; state = 0; }
break;
case 2:
if (buffer[i] == ' ' || buffer[i] == '\t') { a += buffer[i]; state = 3; }
else { a = ""; state = 0; }
break;
case 3:
if (buffer[i] == '>')
{
a += buffer[i];
try
{
string url = getUrl(getHref(a));
if (url != null && findUrl != null)
findUrl(url); // 觸發發現 URL 事件
}
catch { }
state = 0;
}
else a += buffer[i];
break;
}
}
}
}
擷取完整 <a> 標籤後,鏈式呼叫 getHref → getUrl → getFullUrl,最後觸發 findUrl 事件通知發現新 URL。